這個問題在這里已經有了答案: 如何根據對的第二個元素對對的向量進行排序? (7 個回答) 如何根據其中一個成員的值對結構陣列進行排序,在另一個成員的基礎上打破聯系? (3 個回答) 按降序對向量進行排序 11 個答案 17 小時前關閉。
我要做的是以第一個值從最低到最大,第二個從最大到最低并優先于第一個值排序的方式對一個向量對進行排序,同時將它們保持在一起。例如,假設我有這段代碼:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
pair<int, double> p;
vector<pair<int, double> > vp;
p.first = 2;
p.second = 2.4;
vp.push_back(p);
p.first = 9;
p.second = 3.0;
vp.push_back(p);
p.first = 10;
p.second = 3.1;
vp.push_back(p);
p.first = 1;
p.second = 2.4;
vp.push_back(p);
p.first = 5;
p.second = 3.1;
vp.push_back(p);
}
如果我要通過回圈列印出來,我希望它不再輸出:
2, 2.4
9, 3.0
10, 3.1
1, 2.4
5, 3.1
輸出這個
5, 3.1
10, 3.1
9, 3.0
1, 2.4
2, 2.4
現在想象一下,如果這些值不是手動給出的,而是它們是隨機的,并且在每次運行代碼時從 0 到 100 (含)之間回圈隨機次數的 for 回圈中隨機化,則雙方的每個新隨機值存盤在向量中的對(這將使向量的大小為 10。)
如何對向量進行排序,使其輸出與上述示例相同?
uj5u.com熱心網友回復:
最簡單的方法是使用標準函式std::sort()和std::tie().
這是一個演示程式:
#include <iostream>
#include <utility>
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<std::pair<int, double>> v =
{
{ 2, 2.4 },
{ 9, 3.0 },
{ 10, 3.1 },
{ 1, 2.4 },
{ 5, 3.1 }
};
std::sort( std::begin( v ), std::end( v ),
[]( const auto &p1, const auto &p2 )
{
return std::tie( p2.second, p1.first ) < std::tie( p1.second, p2.first );
} );
for (const auto &p : v)
{
std::cout << p.first << ' ' << p.second << '\n';
}
}
程式輸出為:
5 3.1
10 3.1
9 3
1 2.4
2 2.4
uj5u.com熱心網友回復:
使用std::sort()帶有自定義比較,如:
#include <algorithm>
std::sort(vp.begin(), vp.end(),
[](const std::pair<int, double> &p1, const std::pair<int, double> &p2){
if (p1.second > p2.second) return true;
if (p1.second < p2.second) return false;
return p1.first < p2.first;
}
);
輸出:
5, 3.1
10, 3.1
9, 3
1, 2.4
2, 2.4
在線演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/408335.html
標籤:
下一篇:如何按日期和值過濾物件陣列
