在 C++ 中使用 make_pair 对两个向量进行排序函数

Posted

技术标签:

【中文标题】在 C++ 中使用 make_pair 对两个向量进行排序函数【英文标题】:Sort function of two vector using make_pair in C++ 【发布时间】:2015-05-06 07:13:42 【问题描述】:

我正在使用 C++ 按 f 的降序对 2 个向量 P 和 f 进行排序。例如,我有

P    f
1000 3
0001 3
1100 2
1000 3

我的预期输出是 磷 1000 3 0001 3 1000 3 1100 2

这意味着如果它的 f 值很高但原始顺序(在 P 中)更大,那么它必须排在后面。对于我的示例,第二个和第三个具有相同的 f =3。但是0001的顺序是2,1000的顺序是3。所以1000排在0001之后。我用这段代码试过,但它变成了

P    f
1000 3
1000 3
0001 3 
1100 2

如何修改?谢谢

vector<vector <int> > P;  
std::vector<double> f;
P.resize(4);
 for (unsigned int i = 0 ; i < P.size(); ++i)

  P[i].resize(4);

P[0][0]=1;
P[0][1]=0;
P[0][2]=0;
P[0][3]=0;

P[1][0]=0;
P[1][2]=0;
P[1][2]=0;
P[1][3]=1;

P[2][0]=1;
P[2][3]=1;
P[2][2]=0;
P[2][3]=0;

P[3][0]=1;
P[3][4]=0;
P[3][2]=0;
P[3][3]=0;
f=get_f(P);// Don't care --It will return 3 3 2 3
for(int i=0;i<N;i++)

    for(int j=0;j<4;j++)
    
     cout<<P[i][j];
    
    cout<<endl;

cout<<endl;
vector< pair<double, vector<int> > > X; 
for (int i=0;i<N;i++)
        X.push_back(make_pair(f[i],P[i]));

////Sorting fitness descending order
stable_sort(X.rbegin(), X.rend());
for(int i=0;i<4;i++)

  P[i]=X[i].second;
  f[i]=X[i].first;

for(int i=0;i<4;i++)

    for(int j=0;j<4;j++)
    
     cout<<P[i][j];
    
    cout<<endl;

【问题讨论】:

也许你可以看看zip.iterators make_pair 真的与此无关。 来看看我的更新图。我的代码中发生了什么。你能帮我编辑吗 【参考方案1】:

您可以使用std::stable_sort 来保留等价元素的相对顺序:

std::stable_sort(X.rbegin(), X.rend(),
                [](const auto&lhs, const auto& rhs)  return lhs.first < rhs.first; );

Demo

【讨论】:

@user8430:添加比较 lambda 以不根据向量排序。 谢谢。但我的预期输出是 1000; 0001; 1000;1100 f 初始化错误,已修复。为了兼容 C++11,请将 auto 替换为 std::pair&lt;double, std::vector&lt;int&gt;,(对于 C++03,您必须将 lambda 转换为仿函数) question about your problem with const auto&

以上是关于在 C++ 中使用 make_pair 对两个向量进行排序函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ pair 和make_pair

Armadillo C++:根据其他两个向量对向量进行排序

在c ++中给出两个整数向量(相同的大小和类型),我想从最小到最大的元素对一个进行排序并更改第二个向量的顺序[重复]

如何在 C++ 中使用向量对的向量制作邻接表?

使用 std::vector::swap 方法在 C++ 中交换两个不同的向量是不是安全?

如何在 C++ 中比较两个大向量的大小