获取c+中所有置换的最有效方法+; 我试图计算C++中的许多组合。我自己提出了以下工具,但其效率并不令人满意。获得C-18-2需要3秒钟以上(每2个组合18个),我相信这可以在更短的时间内完成 vector<vector<int>> Mytool::combo2(int len){ MatrixXd ma = MatrixXd::Zero(len*len*len,2); int ind = 0; for (int i = 0 ;i<len;i++){ for (int j = 0 ;j<len;j++){ VectorXd v1(2); v1<<i,j; ma.row(ind) = v1; ind++; } }; ind = 0; vector<vector<int>> res; for (int i=0;i<ma.rows();i++){ int num1 = ma(i,0); int num2 = ma(i,1); if (num1!=num2){ vector<int> v1; v1.push_back(num1); v1.push_back(num2); sort(v1.begin(),v1.end()); if (find(res.begin(),res.end(),v1)==res.end()) res.push_back(v1); } } return res; } 向量Mytool::combo2(int len){ 矩阵xSD ma=矩阵xSD::零(len*len*len,2); int ind=0; 对于(int i=0;i

获取c+中所有置换的最有效方法+; 我试图计算C++中的许多组合。我自己提出了以下工具,但其效率并不令人满意。获得C-18-2需要3秒钟以上(每2个组合18个),我相信这可以在更短的时间内完成 vector<vector<int>> Mytool::combo2(int len){ MatrixXd ma = MatrixXd::Zero(len*len*len,2); int ind = 0; for (int i = 0 ;i<len;i++){ for (int j = 0 ;j<len;j++){ VectorXd v1(2); v1<<i,j; ma.row(ind) = v1; ind++; } }; ind = 0; vector<vector<int>> res; for (int i=0;i<ma.rows();i++){ int num1 = ma(i,0); int num2 = ma(i,1); if (num1!=num2){ vector<int> v1; v1.push_back(num1); v1.push_back(num2); sort(v1.begin(),v1.end()); if (find(res.begin(),res.end(),v1)==res.end()) res.push_back(v1); } } return res; } 向量Mytool::combo2(int len){ 矩阵xSD ma=矩阵xSD::零(len*len*len,2); int ind=0; 对于(int i=0;i,c++,combinations,permutation,C++,Combinations,Permutation,而言,stl方法是使用std::next_排列 std::vector<std::vector<int>> res; std::vector<int> v(size - 2, 0); v.resize(size, 1); // vector you be sorted at start : here {0, .., 0, 1, 1}. do { res.push_back(v); } while (std::next_permutation(v.be

而言,stl方法是使用
std::next_排列

std::vector<std::vector<int>> res;
std::vector<int> v(size - 2, 0);
v.resize(size, 1); // vector you be sorted at start : here {0, .., 0, 1, 1}.
do {
     res.push_back(v);
} while (std::next_permutation(v.begin(), v.end()));
std::vector res;
标准:向量v(大小-2,0);
v、 resize(size,1);//开始时要排序的向量:这里{0,…,0,1,1}。
做{
res.push_back(v);
}while(std::next_置换(v.begin(),v.end());


正如Matthieu M所指出的,直接在do while循环中进行工作会更有效。

一种更简单的方法是使用两个元素的组合,可以使用双循环:

std::vector<std::vector<int>> res;

for (std::size_t i = 0; i != size; ++i) {
    for (std::size_t j = i + 1; j != size; ++j) {
        std::vector<int> v(size);
        v[i] = 1;
        v[j] = 1;
        res.push_back(v);
    }
}
std::vector res;
对于(std::size\u t i=0;i!=size;++i){
对于(std::size_t j=i+1;j!=size;++j){
标准:向量v(大小);
v[i]=1;
v[j]=1;
res.push_back(v);
}
}

我想指出,如果可能的话,最好反复使用它(即,在
do/while
中做工作),而不是先生成然后消费。这样可以避免使用
res
,这可能会占用大量内存。@MatthieuM:我同意你的观点。非常有用。谢谢你们两位!