При тестировании кода, который должен работать с последовательностями входных данных, где порядок аргументов не так важен, полезно проверять, получаем ли мы одинаковый результат во
Независимо от того, зачем нужны все перестановки для какого-то диапазона значений, std::next_permutation
Как это делается
В данном примере мы напишем программу, которая считывает несколько строк, содержащих слова, из стандартного потока ввода, а затем применим функцию std::next_permutation
1. Как и обычно, сначала включим все необходимые заголовочные файлы и объявим об использовании пространства имен std
#include
#include
#include
#include
#include
using namespace std;
2. Мы начнем с вектора строк, который заполним из стандартного потока ввода. Затем
int main()
{
vector
sort(begin(v), end(v));
3. Далее выведем содержимое вектора на консоль. Затем вызовем функцию std::next_permutation
next_permutation
вернет значение false
, когда будет сгенерирована do {
copy(begin(v), end(v),
ostream_iterator
cout << '\n';
} while (next_permutation(begin(v), end(v)));
}
4. Скомпилируем и запустим функцию, передав ей какие-нибудь данные:
$ echo "a b c" | ./input_permutations
a, b, c,
a, c, b,
b, a, c,
b, c, a,
c, a, b,
c, b, a,
Как это работает
Алгоритм std::next_permutation
true
, если может найти следующую перестановку. В противном случае он возвращает значение false
. Но что вообще означает выражение Алгоритм, с помощью которого функция std::next_permutation
1. Найдем самое большое значение индекса i
v[i-1] < v[i]
. Если такого значения нет, то вернем значение false
.2. Теперь найдем самое большое значение индекса j
j >= i и v[j] > v[i-1]
.3.
j
и i-1
.4. Изменим порядок элементов, находящихся между позицией i
5. Вернем значение true
Отдельные порядки перестановки, которые мы получим в результате вызова этой функции, всегда будут появляться в одинаковой последовательности. Чтобы найти все возможные перестановки, мы поначалу отсортировали массив. Это было сделано потому, что если бы ввели строку "c b a"
Инструмент для слияния словарей
Представьте, что у вас имеется отсортированный список элементов, у кого-то другого появляется
Данная операция также называется
Алгоритм std::merge
Как это делается