Contoh umum untuk rentang C ++ 11 berbasis untuk () selalu sesuatu yang sederhana seperti ini:
std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
std::cout << xyz << std::endl;
}
Dalam hal xyz
ini adalah int
. Tapi, apa yang terjadi ketika kita memiliki sesuatu seperti peta? Apa jenis variabel dalam contoh ini:
std::map< foo, bar > testing = { /*...blah...*/ };
for ( auto abc : testing )
{
std::cout << abc << std::endl; // ? should this give a foo? a bar?
std::cout << abc->first << std::endl; // ? or is abc an iterator?
}
Ketika kontainer yang dilalui adalah sesuatu yang sederhana, sepertinya rentang berbasis untuk () loop akan memberi kita setiap item, bukan iterator. Yang bagus ... jika itu iterator, hal pertama yang harus selalu kita lakukan adalah tetap melakukannya.
Tapi saya bingung apa yang diharapkan ketika datang ke hal-hal seperti peta dan multimaps.
(Saya masih menggunakan g ++ 4.4, sedangkan loop berbasis rentang ada di g ++ 4.6+, jadi saya belum memiliki kesempatan untuk mencobanya.)
c++
c++11
for-loop
dictionary
Stéphane
sumber
sumber
std::begin
danstd::end
fungsi atau fungsi anggota dengan nama yang sama.Jawaban:
Setiap elemen wadah adalah a
map<K, V>::value_type
, yang adalahtypedef
untukstd::pair<const K, V>
. Akibatnya, dalam C ++ 17 atau lebih tinggi, Anda dapat menulisatau sebagai
jika Anda tidak berencana mengubah nilai.
Dalam C ++ 11 dan C ++ 14, Anda dapat menggunakan
for
loop yang disempurnakan untuk mengekstrak masing-masing pasangan sendiri, lalu mengekstrak kunci dan nilai secara manual:Anda juga dapat mempertimbangkan menandai
kv
variabelconst
jika Anda ingin tampilan hanya baca dari nilai-nilai.sumber
Dalam C ++ 17 ini disebut binding terstruktur , yang memungkinkan untuk hal berikut:
sumber
const &
kunci, tetapi referensi non-const ke nilai? (karena itulah yang dilakukan map :: value_type ...)k
adalahconst
jika Anda menggunakanfor(auto&[k,v]:testing)
Dari makalah ini: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2049.pdf
for( type-specifier-seq simple-declarator : expression ) statement
secara sintaksis setara dengan
Jadi Anda dapat dengan jelas melihat apa yang ada
abc
dalam kasus Anda nantinyastd::pair<key_type, value_type >
. Jadi untuk mencetak Anda dapat mengakses setiap elemen denganabc.first
danabc.second
sumber
Jika Anda hanya ingin melihat kunci / nilai dari peta Anda dan suka menggunakan boost, Anda dapat menggunakan boost adapter dengan loop berbasis rentang:
ada dorongan setara :: adapter :: key_values
http://www.boost.org/doc/libs/1_51_0/libs/range/doc/html/range/reference/adaptors/reference/map_values.html
sumber
Jika operator penyalinan foo and bar murah (mis. Int, char, pointer dll), Anda dapat melakukan hal berikut:
sumber