以下のコードスニペットは、std :: sortがベクトルの値を交互に表示していることを示しています。std :: sortがベクトル内の値を交互に表示する理由
std::vector<int> a;
std::vector<std::string> b;
std::vector<std::pair<int&, std::string&>> p;
a.push_back(1);
a.push_back(3);
a.push_back(2);
b.push_back("hi 1");
b.push_back("hi 3");
b.push_back("hi 2");
p.push_back(std::pair<int&, std::string&>(a[0],b[0]));
p.push_back(std::pair<int&, std::string&>(a[1],b[1]));
p.push_back(std::pair<int&, std::string&>(a[2],b[2]));
std::sort(p.begin(),p.end());
std::cout << a[0] << " " << a[1] << " " << a[2] << std::endl;
std::cout << b[0] << " " << b[1] << " " << b[2] << std::endl;
私はそれが
1 2 3
hi 1 hi 2 hi 3
を印刷するように期待していますが、代わりにそれは
1 3 3
hi 1 hi 3 hi 3
なぜを出力しますか?私のコンパイラはgcc 4.9.3です。
私は2つのベクトルを並べ替えようとしており、参照のペアのベクトルを使用することはhttps://stackoverflow.com/a/37929675/3667089で提案されています。
'a'と' b'ではなく、 'p'だけをソートしています。また、 'std :: sort'を' std :: pair'と一緒に使うことは辞書的にソートします - これはあなたが望むものではないかもしれません。代わりに 'first'フィールドに基づいてソートし、' std ::ソート '(downvoter btwではない)。 – ArchbishopOfBanterbury
@ArchbishopOfBanterbury 'p'は' a'と 'b'への参照を持っていますが、' p'が交互に 'a'と' b'を交互に更新してはいけませんか? – user3667089
また、std:stable_sortを探します.2つの値が同じ量だけ評価された場合、通常のソートでは、安定したソートを使用する必要がないため、ソートすることができます。 –