C ++: устранение неполадок при работе с std :: next_permutation и std :: prev_permutation - PullRequest
2 голосов
/ 07 января 2012

РЕДАКТИРОВАТЬ: Извините, это просто моя ошибка в инициализации в коде ниже.

const int kDigits = 7;
std::vector<int> number(kDigits);
for (int i = kDigits - 1; i >= 0; i--) {
    number[i] = i + 1;
}

Вектор number инициализируется как 7, 6, 5, 4, 3, 2, 1.
Моя цель - генерировать перестановки в порядке убывания: 7654321 7654312 7654231 7654213 7654132

Этот код работает :

do {
...
}
while (std::prev_permutation(number.rbegin(), number.rend()));

Однако я не понимаю, почему. Так как 7654321 является самой большой лексикографической перестановкой, не должен ли while (std::prev_permutation(number.begin(), number.end())); (без обратных итераторов) генерировать ее правильно, поскольку она будет генерировать предыдущую перестановку в порядке? Однако, это возвращает false с первой попытки, даже если это должно генерировать «более низкую перестановку».

Кроме того, в приведенном выше коде, поскольку он использует обратные итераторы, мой разум интерпретирует его как нахождение предыдущей перестановки 1234567 (7654321 в обратном направлении), которая, как мне кажется, не должна иметь ничего.

Большое спасибо за помощь заранее! Я с нетерпением жду, чтобы выяснить, что я неправильно истолковал / чего мне не хватает.

Ответы [ 2 ]

2 голосов
/ 07 января 2012

Вектор number инициализируется 1,2,3,4,5,6,7, а не 7,6,5,4,3,2,1.Вот почему ваш код работает.

Если вы хотите, чтобы он был инициализирован до 7,6,5,4,3,2,1, вам нужно исправить процедуру инициализации.

0 голосов
/ 07 января 2012

Первая перестановка по определению не имеет предыдущей перестановки в прямом порядке. Иначе это было бы не первым. Вот почему вам нужно rbegin, чтобы получить «первую» перестановку для обратного итератора (которая является последней перестановкой).

...