2014-01-19 3 views
2

Я пытаюсь напечатать все перестановки вектора строк. Этот код работает как задумано:next_permutation вектора строк пропускает одну перестановку

#include<iostream> 
#include<vector> 
#include<algorithm> 

using namespace std; 

int main() { 
    vector<string> v; 

    v.push_back("+1"); 
    v.push_back("x4"); 

    do { 
     cout << v[0] << " " << v[1] << endl; 
    } while (next_permutation(v.begin(), v.end())); 
} 

Выход:

+1 x4 
x4 +1 

Но когда я изменяю "x4" для итерации "* 4" Петли next_pemutation только один раз.

#include<iostream> 
#include<vector> 
#include<algorithm> 

using namespace std; 

int main() { 
    vector<string> v; 

    v.push_back("+1"); 
    v.push_back("*4"); 

    do { 
     cout << v[0] << " " << v[1] << endl; 
    } while (next_permutation(v.begin(), v.end())); 
} 

Выход:

+1 *4 

Другие символы, такие как #, кажется, имеет тот же эффект. Почему это происходит?

+10

Он должен начать отсортированный пройти через все из них. – chris

+0

«Следующий» означает «следующий в определенном порядке всех перестановок». –

+1

На самом деле, пожалуйста, сначала объясните нам, какая часть [документации] (http://en.cppreference.com/w/cpp/algorithm/next_permutation) вы не понимаете, поэтому мы можем дать полезный ответ. –

ответ

3

Ваш алгоритм должен начать с отсортированные vector печатать все перестановки:

"+1" < "x4" ('+' < 'x'): так что вы на самом деле начать с «первой» перестановки.
"+1" > "*4" ('+' > '*'): Таким образом, вы не начинаете с первой перестановки.

Просмотреть анкету пользователя ascii, чтобы иметь заказ или char.

Чтобы решить вашу проблему, вы можете сделать после последнего push_back:

std::sort(v.begin(), v.end()); 
Смежные вопросы