Jika saya memiliki vektor pasangan:
std::vector<std::pair<int, int> > vec;
Apakah ada dan cara mudah untuk mengurutkan daftar dalam urutan yang meningkat berdasarkan elemen kedua dari pasangan?
Saya tahu saya bisa menulis objek fungsi kecil yang akan melakukan pekerjaan, tetapi apakah ada cara untuk menggunakan bagian-bagian STL yang ada dan std::less
melakukan pekerjaan secara langsung?
EDIT: Saya mengerti bahwa saya bisa menulis fungsi atau kelas terpisah untuk diteruskan ke argumen ketiga untuk mengurutkan. Pertanyaannya adalah apakah saya bisa membuatnya dari barang standar. Saya benar-benar sesuatu yang terlihat seperti:
std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());
Jawaban:
EDIT : menggunakan c ++ 14, solusi terbaik adalah sangat mudah untuk menulis berkat lambdas yang sekarang dapat memiliki parameter tipe
auto
. Ini adalah solusi favorit saya saat iniCukup gunakan komparator khusus (ini merupakan argumen ke-3 opsional untuk
std::sort
)Jika Anda menggunakan kompiler C ++ 11, Anda dapat menulis yang sama menggunakan lambdas:
EDIT : sebagai tanggapan atas suntingan Anda terhadap pertanyaan Anda, inilah beberapa pemikiran ... jika Anda benar-benar ingin menjadi kreatif dan dapat menggunakan kembali konsep ini banyak, cukup buat templat:
maka Anda dapat melakukan ini juga:
atau bahkan
Meskipun jujur, ini semua sedikit berlebihan, tulis saja fungsi 3 baris dan lakukan dengan itu :-P
sumber
operator<
padapair<T1,T2>
. Komparator default menggunakan kedua elemen pertama dan kedua (dalam kasus yang pertama adalah sama). Di sini hanya yang kedua yang digunakan."is there and easy way to sort the list in increasing order based on the second element of the pair?"
Anda dapat menggunakan boost seperti ini:
Saya tidak tahu cara standar untuk melakukan ini sama pendek dan ringkasnya, tetapi Anda bisa ambil
boost::bind
itu semua terdiri dari header.sumber
Cukup sederhana, Anda menggunakan fungsi sortir dari algoritma dan menambahkan fungsi bandingkan sendiri
Sekarang Anda harus membuat perbandingan berdasarkan pilihan kedua jadi nyatakan Anda "myComparison" sebagai
sumber
Dengan C ++ 0x kita dapat menggunakan fungsi lambda:
Dalam contoh ini jenis pengembalian
bool
dideduksi secara implisit.Lambda mengembalikan tipe
Ketika fungsi lambda memiliki pernyataan tunggal, dan ini adalah pernyataan kembali, kompilator dapat menyimpulkan tipe kembali. Dari C ++ 11, §5.1.2 / 4:
Untuk secara eksplisit menentukan jenis pengembalian gunakan formulir
[]() -> Type { }
, seperti di:sumber
if (lhs.second == 0)
?lhs.second < rhs.second
dapat kembalitrue
ataufalse
dan kompilator dapat dengan jelas menyimpulkanbool
. Hanya ingin menunjukkan[]() -> Type { }
kasusnya.Untuk sesuatu yang dapat digunakan kembali:
Anda dapat menggunakannya sebagai
atau
sumber
Anda harus bergantung pada select2nd yang tidak standar
sumber
Cobalah menukar elemen pasangan sehingga Anda dapat menggunakannya
std::sort()
seperti biasa.sumber