I'm mencoba untuk memeriksa apakah kunci yang diberikan adalah dalam peta dan agak bisa't melakukan hal ini:
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 cetak apa yang di p?
Untuk memeriksa apakah kunci tertentu di peta yang ada, gunakan menghitung
fungsi anggota dalam salah satu cara berikut:
m.count(key) > 0
m.count(key) == 1
m.count(key) != 0
The dokumentasi untuk peta::cari
mengatakan: "anggota Lain fungsi, peta::count
, dapat digunakan untuk memeriksa apakah kunci tertentu ada."
The dokumentasi untuk peta::count
mengatakan: "Karena semua unsur-unsur dalam peta wadah 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:
value = m.at(key)
Tidak seperti peta::operator[], peta::di
tidak akan membuat kunci yang baru dalam peta jika kunci yang ditentukan tidak ada.
C++20 memberi kita std::map::berisi
untuk melakukan itu.
#include <iostream>
#include <string>
#include <map>
int main()
{
std::map<int, std::string> example = {{1, "One"}, {2, "Two"},
{3, "Three"}, {42, "Don\'t Panic!!!"}};
if(example.contains(42)) {
std::cout << "Found\n";
} else {
std::cout << "Not found\n";
}
}
Saya pikir anda ingin peta::cari
. Jika m.menemukan("f")
adalah sama dengan m.end()
, maka kunci tidak ditemukan. Jika tidak, menemukan mengembalikan sebuah iterator menunjuk pada elemen yang ditemukan.
Kesalahan adalah karena p.pertama
adalah sebuah iterator, yang doesn't bekerja untuk aliran penyisipan. Mengubah baris terakhir untuk cout << (p.pertama)->pertama;
. p
adalah sepasang iterator, p.pertama
adalah sebuah iterator, p.pertama->pertama
adalah kunci string.
Peta dapat hanya pernah memiliki satu elemen kunci yang diberikan, sehingga equal_range
isn't sangat berguna. It's didefinisikan untuk peta, karena itu's didefinisikan untuk semua asosiatif wadah, tapi itu's jauh lebih menarik untuk multimap.
template <typename T, typename Key>
bool key_exists(const T& container, const Key& key)
{
return (container.find(key) != std::end(container));
}
Tentu saja jika anda ingin mendapatkan lebih bagus anda bisa selalu template fungsi yang juga ditemukan fungsi dan tidak ditemukan fungsi, sesuatu seperti ini:
template <typename T, typename Key, typename FoundFunction, typename NotFoundFunction>
void find_and_execute(const T& container, const Key& key, FoundFunction found_function, NotFoundFunction not_found_function)
{
auto& it = container.find(key);
if (it != std::end(container))
{
found_function(key, it->second);
}
else
{
not_found_function(key);
}
}
Dan menggunakannya seperti ini:
std::map<int, int> some_map;
find_and_execute(some_map, 1,
[](int key, int value){ std::cout << "key " << key << " found, value: " << value << std::endl; },
[](int key){ std::cout << "key " << key << " not found" << std::endl; });
Kelemahan ini akan datang dengan nama yang baik, "find_and_execute" canggung dan aku bisa't datang dengan sesuatu yang lebih baik dari atas kepala saya...
map<string, string> m;
tombol cek ada atau tidak, dan kembali jumlah terjadi(0/1 di peta):
int num = m.count("f");
if (num>0) {
//found
} else {
// not found
}
tombol cek ada atau tidak, dan kembali iterator:
map<string,string>::iterator mi = m.find("f");
if(mi != m.end()) {
//found
//do something to mi.
} else {
// not found
}
dalam pertanyaan anda, kesalahan yang disebabkan oleh bad operator<<
overload, karena p.pertama
adalah peta<string, string>
, anda tidak bisa mencetaknya. coba ini:
if(p.first != p.second) {
cout << p.first->first << " " << p.first->second << endl;
}
C++17
modern ini sedikit lebih dengan sebuah Jika pernyataan dengan penginisialisasi
.
Dengan cara ini anda dapat memiliki kue dan memakannya juga.
if ( auto it{ m.find( "key" ) }; it != std::end( m ) )
{
// Destructure the returned pair in to
// its sub components. Get them by reference.
// You can also get them by value.
auto&[ key, value ] { *it };
// Grab either the key or value stored in the pair.
// The key is stored in the 'first' variable and
// the 'value' is stored in the second.
auto& mkey{ it->first };
auto& mvalue{ it->second };
// That or just grab the entire pair pointed
// to by the iterator.
auto& pair{ *it };
}
else
{
// Key was not found..
}
Berhati-hati dalam membandingkan menemukan hasil dengan akhir seperti untuk peta 'm' karena semua jawaban yang telah dilakukan di atas peta<string,string>::iterator i = m.menemukan("f");
if (i == m.end())
{
}
else
{
}
anda tidak harus mencoba dan melakukan operasi apapun seperti pencetakan kunci atau nilai dengan iterator saya jika sama dengan m.end() lain itu akan menyebabkan kesalahan segmentasi.
Aku tahu pertanyaan ini sudah memiliki beberapa jawaban yang baik tapi saya pikir saya solusi layak berbagi.
Ia bekerja untuk kedua std::map
dan std::vektor<std::pasangan<T, U>>
dan tersedia dari C++11.
``c++
template <typename ForwardIterator, typename Kunci>
bool contains_key(ForwardIterator pertama, ForwardIterator terakhir, Kunci const key) {
menggunakan Tim = typename std::iterator_traits
auto search_result = std::find_if( pertama, terakhir, [&kunci](Tim const& item) { kembali item.pertama == kunci; } );
jika (search_result == terakhir) { return false; } else { return true; } } ``
Membandingkan kode std::map::cari dan std::map::count, I'd mengatakan pertama dapat menghasilkan kinerja beberapa keuntungan:
const_iterator find(const key_type& _Keyval) const
{ // find an element in nonmutable sequence that matches _Keyval
const_iterator _Where = lower_bound(_Keyval); // Here one looks only for lower bound
return (_Where == end()
|| _DEBUG_LT_PRED(this->_Getcomp(),
_Keyval, this->_Key(_Where._Mynode()))
? end() : _Where);
}
size_type count(const key_type& _Keyval) const
{ // count all elements that match _Keyval
_Paircc _Ans = equal_range(_Keyval); // Here both lower and upper bounds are to be found, which is presumably slower.
size_type _Num = 0;
_Distance(_Ans.first, _Ans.second, _Num);
return (_Num);
}
Jika anda ingin membandingkan pasangan dari peta anda dapat menggunakan metode ini:
typedef map<double, double> TestMap;
TestMap testMap;
pair<map<double,double>::iterator,bool> controlMapValues;
controlMapValues= testMap.insert(std::pair<double,double>(x,y));
if (controlMapValues.second == false )
{
TestMap::iterator it;
it = testMap.find(x);
if (it->second == y)
{
cout<<"Given value is already exist in Map"<<endl;
}
}
Ini adalah teknik yang berguna.