Saya mencoba memeriksa apakah kunci yang diberikan ada di peta dan agak tidak bisa melakukannya:
typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want
cout << p.first;//I'm getting error here
jadi bagaimana saya bisa mencetak apa yang ada di p?
c++
dictionary
stl
Tidak ada yang bisa kita lakukan
sumber
sumber
std::pair<iterator,bool> insert( const value_type& value );
Apa bool itu kembali? apakah itu memberitahu, jika kuncinya sudah ada atau tidak?Jawaban:
Menggunakan
map::find
sumber
map::count
count
mengembalikanint
sementarafind
mengembalikan seluruh iterator. Anda menyimpan konstruksi iterator :) Jelas, jika Anda kemudian akan menggunakan nilai jika ada, gunakan temukan dan simpan hasilnya.count
dan kecepatannyafind
hampir identik saat menggunakan peta yang membutuhkan kunci unik. (1) Jika Anda tidak memerlukan elemen untuk mempertahankan urutan tertentu, gunakan std :: unordered_map , yang memiliki pencarian hampir konstan dan dapat sangat bermanfaat saat menyimpan lebih dari beberapa pasangan. (2) Jika Anda ingin menggunakan nilai jika ada, simpan hasil :: find dan gunakan iterator untuk mencegah 2 pencarian:auto it = m.find("f"); if (it != m.end()) {/*Use it->second*/}
Untuk memeriksa apakah kunci tertentu di peta ada, gunakan
count
fungsi anggota dalam salah satu cara berikut:The dokumentasi untuk
map::find
mengatakan: "fungsi anggota lain,map::count
, dapat digunakan untuk hanya memeriksa apakah kunci tertentu ada."The dokumentasi untuk
map::count
mengatakan: "Karena semua elemen dalam wadah peta yang unik, fungsi hanya dapat kembali 1 (jika unsur ini ditemukan) atau nol (jika tidak)."Untuk mengambil nilai dari peta melalui kunci yang Anda tahu ada, gunakan peta :: di :
Tidak seperti map :: operator [] ,
map::at
tidak akan membuat kunci baru di peta jika kunci yang ditentukan tidak ada.sumber
find
sebagai gantinya. Thesecond
atribut dari iterator dikembalikan olehfind
dapat digunakan mengambil nilai dari kunci. Jika Anda menggunakancount
ituat
atauoperator[]
Anda melakukan dua operasi ketika Anda bisa menggunakan hanya satu.if(m.count(key))
int
kebool
. Meskipun ada kompiler C ++ lainnya yang tidak mengeluarkan peringatan serupa, saya lebih suka menggunakan perbandingan eksplisit untuk membuat maksudnya jelas dan meningkatkan keterbacaan. Perhatikan bahwa bahasa lain seperti C # melarang konversi tersirat untuk mencegah kemungkinan memperkenalkan kesalahan pemrograman halus.C ++ 20 memberi kita
std::map::contains
untuk melakukan itu.sumber
Anda bisa menggunakan
.find()
:sumber
Jika Anda ingin menggunakan API lain, cari cari
m.count(c)>0
sumber
Saya pikir kamu mau
map::find
. Jikam.find("f")
sama denganm.end()
, maka kuncinya tidak ditemukan. Jika tidak, temukan kembalikan iterator yang menunjuk ke elemen yang ditemukan.Kesalahan ini karena
p.first
merupakan iterator, yang tidak berfungsi untuk penyisipan aliran. Ubah baris terakhir Anda kecout << (p.first)->first;
.p
adalah sepasang iterator,p.first
adalah iterator,p.first->first
adalah kunci string.Peta hanya dapat memiliki satu elemen untuk kunci yang diberikan, jadi
equal_range
tidak terlalu berguna. Ini ditentukan untuk peta, karena itu ditentukan untuk semua wadah asosiatif, tetapi jauh lebih menarik untuk multimap.sumber
C++17
disederhanakan ini sedikit lebih banyak denganIf statement with initializer
. Dengan cara ini Anda dapat memiliki kue dan memakannya juga.sumber
periksa kunci ada atau tidak, dan kembalikan jumlah yang terjadi (0/1 di peta):
periksa kunci ada atau tidak, dan kembalikan iterator:
dalam pertanyaan Anda, kesalahan yang disebabkan oleh buruk
operator<<
yang berlebihan, karenap.first
inimap<string, string>
, Anda tidak dapat mencetak keluar. coba ini:sumber
cout
count
Tentu saja jika Anda ingin menjadi pelamun Anda selalu bisa templat keluar fungsi yang juga mengambil fungsi ditemukan dan fungsi tidak ditemukan, seperti ini:
Dan gunakan seperti ini:
Kelemahan dari ini adalah datang dengan nama yang bagus, "find_and_execute" canggung dan saya tidak dapat menemukan sesuatu yang lebih baik dari atas kepala saya ...
sumber
Hati-hati dalam membandingkan hasil pencarian dengan akhir seperti untuk peta 'm' karena semua jawaban telah dilakukan di atas peta :: iterator i = m.find ("f");
Anda tidak boleh mencoba dan melakukan operasi apa pun seperti mencetak kunci atau nilai dengan iterator i jika sama dengan m.end () jika tidak maka akan menyebabkan kesalahan segmentasi.
sumber
Membandingkan kode std :: map :: find dan std :: map :: count, saya katakan yang pertama dapat menghasilkan beberapa keuntungan kinerja:
sumber
Saya tahu pertanyaan ini sudah memiliki beberapa jawaban yang baik tetapi saya pikir solusi saya layak untuk dibagikan.
Ia bekerja untuk keduanya
std::map
danstd::vector<std::pair<T, U>>
dan tersedia dari C ++ 11.sumber
Jika Anda ingin membandingkan pasangan peta, Anda dapat menggunakan metode ini:
Ini adalah teknik yang berguna.
sumber
sumber