Bagaimana saya bisa loop std::map
dalam C ++? Peta saya didefinisikan sebagai:
std::map< std::string, std::map<std::string, std::string> >
Misalnya, wadah di atas menampung data seperti ini:
m["name1"]["value1"] = "data1";
m["name1"]["value2"] = "data2";
m["name2"]["value1"] = "data1";
m["name2"]["value2"] = "data2";
m["name3"]["value1"] = "data1";
m["name3"]["value2"] = "data2";
Bagaimana saya bisa mengulang peta ini dan mengakses berbagai nilai?
Jawaban:
Pertanyaan lama tetapi jawaban yang tersisa sudah usang pada C ++ 11 - Anda dapat menggunakan rentang berbasis untuk loop dan cukup lakukan:
ini harus jauh lebih bersih daripada versi sebelumnya, dan menghindari salinan yang tidak perlu.
Beberapa bantuan mengganti komentar dengan definisi eksplisit dari variabel referensi (yang bisa dioptimalkan jika tidak digunakan):
sumber
const
setelahauto
? Apakah ini murni estetika?int const *x
danint *const x
Anda dapat menuliskannya sebagaiint const *const x
IMO yang jauh lebih jelas daripadaconst int *const x
. Tapi itu hanya diurai dari kiri ke kanan sehingga efeknya sama. Lihat jawaban atas pertanyaan ini: stackoverflow.com/questions/5503352/const-before-or-const-afterAnda bisa menggunakan iterator.
sumber
for(auto iterator = m.begin(); iterator != m.end(); iterator++)
atau lebih bagus di C ++ 0x:
sumber
Dengan C ++ 17 (atau lebih baru), Anda dapat menggunakan fitur "binding terstruktur", yang memungkinkan Anda menentukan banyak variabel, dengan nama yang berbeda, menggunakan satu tupel / pasangan. Contoh:
The proposal asli (oleh tokoh-tokoh Bjarne Stroustrup, Herb Sutter dan Gabriel Dos Reis) adalah menyenangkan untuk membaca (dan sintaks yang disarankan adalah lebih intuitif IMHO); ada juga kata-kata yang diusulkan untuk standar yang membosankan untuk dibaca tetapi lebih dekat dengan apa yang sebenarnya masuk.
sumber
Lakukan sesuatu seperti ini:
sumber
C ++ 11:
keluaran:
sumber
gunakan
std::map< std::string, std::map<std::string, std::string> >::const_iterator
saat peta adalah const.sumber
auto
bro, atau dia yang menggunakan vim akan pergi KO.Seperti einpoklum disebutkan dalam jawaban mereka , karena C ++ 17 Anda juga dapat menggunakan deklarasi penjilidan terstruktur . Saya ingin memperluas itu dengan memberikan solusi lengkap untuk beralih di atas peta peta dengan cara yang nyaman:
Catatan 1: Untuk mengisi peta, saya menggunakan daftar penginisialisasi (yang merupakan fitur C ++ 11 ). Ini kadang-kadang berguna untuk menjaga inisialisasi tetap tetap ringkas.
Catatan 2: Jika Anda ingin memodifikasi peta
m
di dalam loop, Anda harus menghapusconst
kata kunci.Kode di Coliru
sumber
Solusi pertama adalah Gunakan range_based untuk loop, seperti:
Catatan: Kapan
range_expression
tipestd::map
kemudianrange_declaration
jenis astd::pair
.Kode 1:
Solusi Kedua:
Kode 2
sumber