แก้ไข : โดยใช้ c ++ 14 ทางออกที่ดีที่สุดนั้นง่ายมากในการเขียนด้วย lambdas ที่สามารถมีพารามิเตอร์ประเภทauto
ได้แล้ว นี่คือวิธีแก้ปัญหาที่ชื่นชอบในปัจจุบัน
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
เพียงใช้ตัวเปรียบเทียบที่กำหนดเอง (เป็นอาร์กิวเมนต์ที่ 3 ซึ่งเป็นทางเลือกstd::sort
)
struct sort_pred {
bool operator()(const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
}
};
std::sort(v.begin(), v.end(), sort_pred());
หากคุณใช้คอมไพเลอร์ C ++ 11 คุณสามารถเขียนแบบเดียวกันโดยใช้ lambdas:
std::sort(v.begin(), v.end(), [](const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
});
แก้ไข : ในการตอบสนองต่อการแก้ไขของคุณกับคำถามของคุณที่นี่เป็นความคิดบางอย่าง ... ถ้าคุณจริงๆอยากจะมีความคิดสร้างสรรค์และสามารถนำมาใช้แนวคิดนี้มากเพียงให้แม่แบบ:
template <class T1, class T2, class Pred = std::less<T2> >
struct sort_pair_second {
bool operator()(const std::pair<T1,T2>&left, const std::pair<T1,T2>&right) {
Pred p;
return p(left.second, right.second);
}
};
จากนั้นคุณสามารถทำได้เช่นกัน:
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
หรือแม้กระทั่ง
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
แม้ว่าตามจริงแล้วทั้งหมดนี้เป็นเรื่องที่มากเกินไปเพียงแค่เขียนฟังก์ชัน 3 บรรทัดและดำเนินการกับมัน :-P