c++关联容器的成员函数find的一个例子
?先來一個灰色難懂的部分鎮(zhèn)樓。
#include <string> #include <iostream> #include <list> #include <vector> #include <set> #include <map> #include <utility> #include <algorithm> using namespace std; int main() { set<int> iset = {0,1,2,3,4,5,6,7,8,9}; set<int>::iterator pos1 = iset.find(1); cout << *pos1 << endl; auto pos2 = iset.find(11); if(pos2 == iset.end())cout<< "yes" << endl; auto n = iset.count(1); cout << n << endl; auto n1 = iset.count(11); cout << n1 << endl;multimap<string,size_t> m1{{"abc",1},{"abc",2},{"abcd",3}}; auto pos3 = m1.find("abc"); if(pos3 == m1.end())cout << "end"<< endl; else cout << "not end" << endl; find(m1.begin(),m1.end(),pair<const string,size_t>{"abc",1}); find(m1.begin(),m1.end(),multimap<string,size_t>::value_type("abc",1)); find(m1.begin(),m1.end(),pair<const multimap<string,size_t>::key_type,size_t>("abc",1)); return 0; }總結(jié),關(guān)聯(lián)容器的find成員函數(shù)和algorithm中的find是完全兩回事,前一個是按照關(guān)鍵字查詢,另一個是直接查找元素。
關(guān)聯(lián)容器key_type是不帶const的。
例如,map<string,size_t>,那么key_type是string而不是const string.
第一部分:不允許重復(fù)關(guān)鍵字查找元素。
知識點1.下標(biāo)和at操作只適合于非const的map和unordered_map,如下:
#include <string> #include <iostream> #include <set> #include <map> #include <utility> using namespace std; int main() { map<string,size_t> m{{"str1",1},{"str2",2},{"str3",3},{"str4",4}}; cout << m.at("str1") << endl; cout << m["str2"] << endl;return 0; }知識點2:c.find(k),返回第一個指向關(guān)鍵字k的元素的迭代器,如果k不在其中,那么返回尾后迭代器,如下:
map<string,size_t>::iterator pos1 = m.find("str3"); cout << pos1->first << " "; cout << pos1->second << endl; set<int> sint {1,2,3,4,5,6,7,8,9}; auto pos2 = sint.find(4); cout << *pos2 << endl;下面這句代碼就可以檢查"str1"是否在m中,如果不在,打印一條消息:?
if(m.find("str1") == m.end())cout << "str1" << " is not in the map.\n" << endl;知識點3.? c.count(k),返回關(guān)鍵字是k的元素的數(shù)量,對于不允許重復(fù)關(guān)鍵字的容器,返回值始終是1或者0.
auto pos3 = sint.count(2); cout << pos3 << endl; auto pos4 = m.count("str2"); cout << pos4 << endl;count函數(shù)始終返回關(guān)鍵字的個數(shù)。
知識點4. c.lower_bound(k),c.upper_bound(k)
c.lower_bound(k)返回第一個不小于k的元素的迭代器,c.upper_bound(k)返回第一個關(guān)鍵字大于k的元素。
#include <string> #include <iostream> #include <set> #include <map> #include <utility> using namespace std; int main() { multimap<string,size_t> m{{"str1",1},{"str2",2},{"str3",3},{"str4",4},{"str2",4},{"str2",5}};//multimap對象不能使用下標(biāo)和at函數(shù) //cout << m.at("str1") << endl; //cout << m["str2"] << endl;auto pos5 = m.lower_bound("str2"); auto pos6 = m.upper_bound("str2"); for(auto i = pos5;i != pos6;++i)cout << i->first << " "<< i->second << endl;return 0;}執(zhí)行結(jié)果:?
str2 2 str2 4 str2 5其實,lower_bound和upper_bound主要是用來找?guī)讉€相等元素的迭代器的。如果沒有相等元素,它們2個返回相等的,元素k的安全的插入位置(不破壞原有順序)
第二部分:允許重復(fù)關(guān)鍵字查找元素
m是作者到著作的一個映射,而且是multimap,下面的方法可以查出所有某個作者的著作。
#include <string> #include <iostream> #include <set> #include <map> using namespace std; int main() { multimap<string,string> m{{"white","the game theory"},{"white","the game2 theory"},{"robert","the c program language"},{"william","the python"},{"joe","the c++ program language"},{"white","the java language"},{"white","thie html"}};int num = m.count("white"); multimap<string,string>::iterator it; it = m.find("white"); while(num){cout << it -> second << endl;++ it;-- num;}return 0;}注意:c.find(k),作用是查找c內(nèi)第一個關(guān)鍵字等于k的元素。可以通過得到的第一個迭代器逐漸 ++,得到后面等于k的元素的所有迭代器。
結(jié)論:對于有序的關(guān)聯(lián)容器,所有的元素都是按照關(guān)鍵字的順序存儲的。
上述問題也可以利用lower_bound()和upper_bound()來解決,如下:
#include <string> #include <iostream> #include <set> #include <map> using namespace std; int main() { multimap<string,string> m{{"white","the game theory"},{"white","the game2 theory"},{"robert","the c program language"},{"william","the python"},{"joe","the c++ program language"},{"white","the java language"},{"white","thie html"}};for(multimap<string,string>::iterator it = m.lower_bound("white");it != m.upper_bound("white");++ it){cout << it->second << endl;}return 0;} the game theory the game2 theory the java language thie html說明:c.lower_bound(k),返回第一個大于等于k的元素的迭代器,也就是說,如果有相等元素,那就是返回第一個等于k的迭代器。c.upper_bound(k)是返回第一個大于k的迭代器。
? (c.lower_bound(k),c.upper_bound(k))正好是一個前閉后開的等于元素k的迭代器范圍。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的c++关联容器的成员函数find的一个例子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C 库函数 - atoi()
- 下一篇: linux字符处理工具 新手教程