2013-02-14 90 views
1

我有一個大小爲「n」的整數向量。在C++中生成整型向量元素的所有可能組合

e.g. 
std::vector<int> vec; 
vec.pushback(0); 
vec.pushback(1); 
vec.pushback(2); 
vec.pushback(3); 
.... 

現在我想要生成大小= {0,1,2,...,n}的所有可能的組合。

請記住, {0,1,3}不等於{3,1,0}或{1,0,3}或{3,0,1}

請幫助我如果你有一個想法。

在此先感謝。

+11

http://en.cppreference.com/w/cpp/algorithm/next_permutation – Mat 2013-02-14 18:32:12

+1

@Mat謝謝您的回覆,nexr_permutation會產生固定大小的組合,但我如何重複應用它爲不同的大小。 – DataMiner 2013-02-14 18:44:16

+0

查看右側「相關」部分的鏈接。所有這些都已經被問到和回答,你需要選擇這些部分並使其適合你的情況。 – Mat 2013-02-14 18:48:08

回答

2

你可以做這樣的事情:

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

    std::ostream& operator<< (std::ostream& os, std::vector<int> v) 
    { 
     for (auto it = v.begin(); it != v.end(); ++it) 
     { 
      os << *it << ","; 
     } 
     return os; 
    } 

int main() 
{ 
    std::vector<int> v; 
    v.push_back(1); 
    v.push_back(2); 
    v.push_back(3); 
    do { 
     std::cout << v; 
    } while (std::next_permutation(v.begin(), v.end())); 

} 

按@ JamesKanze的評論,如果向量進行排序以開頭才能做到這一點,所以如果你有一個未排序的載體,你應該叫std::sort上它首先。在this

來看,它說:

變換範圍[第一,最後)到從集合的,按字典對於責令operator<comp所有排列的下一個排列。

你可以看到它在行動here

+2

您可能會提到,只有列表以排序開始時纔可以使用。 – 2013-02-14 18:43:42

+1

@Tony感謝您的回覆,我看到它會生成固定大小的組合,但我如何重複應用它來生成不同大小的組合,意味着1,2和3 – DataMiner 2013-02-14 18:49:03

+0

我認爲最簡單的方法是每次再次調用函數時間你的矢量大小的變化。 – 2013-02-14 18:58:30

相關問題