C ++ <algorithm>перестановка - PullRequest
2 голосов
/ 29 июня 2010

Почему эта заметка кода работает (код компилируется и работает нормально, но фактически не показывает перестановок):

int main(int argc, char *argv[])
{
    long number;
    vector<long> interval;
    vector<long>::const_iterator it;

    cout << "Enter number: ";
    cin >> number;

    while(number-->0){
        interval.push_back(number);
    }

    do{
        for(it = interval.begin(); it < interval.end(); ++it){
            cout << *it << " ";
        }
        cout << endl;
    } while(next_permutation(interval.begin(), interval.end()));

    return (0);
}

Но после изменения этой строки:

while(next_permutation(interval.begin(), interval.end()));

с:

while(prev_permutation(interval.begin(), interval.end()));

Разве перестановка не изменяет элементы вектора, воздействуя на позиции?

PS: я редактировал код сейчас.

Ответы [ 3 ]

7 голосов
/ 29 июня 2010

Перестановки лексикографически упорядочены , вот что алгоритмы std::next_permutation и std::prev_permutation пересекают.

Здесь вы вводите "самую большую" перестановку, поэтому следующего по порядку нет.

3 голосов
/ 29 июня 2010

Разве перестановка не изменяет элементы вектора, воздействуя на позиции?

Нет. next_permutation использует порядок элементов для определения следующей перестановки.

Например, если A next_permutation из [A, B, C] (012) будет [A, C, B] (021). Однако если A next_permutation из [A, B, C] (021) будет [C, A, B] (102).

Поскольку ваш вектор изначально был в порядке убывания, это была бы последняя перестановка.

Вы можете использовать порядок std::greater, чтобы изменить направление сравнения.

} while(next_permutation(interval.begin(), interval.end(), greater<long>()));
//                                                         ^^^^^^^^^^^^^^^
1 голос
/ 29 июня 2010

Я не думаю, что next_permutation может работать с позициями (где будет храниться эта информация?).Вы должны иметь возможность сравнивать элементы для работы next_permutation, и именно это он использует для создания лексикографически следующей перестановки.

Попробуйте вставить числа в обратном порядке и посмотрите, работает ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...