c++学习笔记(八)- map
map<key, value>是按key排好序的,key不可以重复。
1. map.lower_bound():按key查找,如果查找的key存在,返回该位置,如果不存在返回大于所查找值的最小key所在位置
1 #include <iostream> 2 #include <map> 3 using namespace std; 4 5 int main () 6 { 7 std::map<char,int> mymap; 8 std::map<char,int>::iterator itlow,itup; 9 10 mymap['a']=20; 11 mymap['b']=40; 12 mymap['b']=50; //key值不重复,会把b的value更新为50 13 mymap['c']=80; //value的值可以重复 14 mymap['d']=80; 15 mymap['e']=100; 16 17 for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it) 18 std::cout << it->first << " => " << it->second << '\n'; 19 cout<<endl; 20 //这段程序其实并不能成功插入,因为key=b已经存在了,value也不会更新 21 itlow=mymap.lower_bound ('b'); //如果键值b存在,itlow指向b,否则指向比b大的最小key所在位置 22 mymap.insert(itlow,std::map<char,int>::value_type('b',40)); //向itlow指向的位置插入map<'b',40> 23 24 for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it) 25 std::cout << it->first << " => " << it->second << '\n'; 26 cout<<endl; 27 28 char c='a'; 29 while(1) 30 { //输入一个字符并插入 31 cin>>c; 32 itlow = mymap.lower_bound(c); 33 if(itlow != mymap.end()) 34 cout<<"insert "<<c<<" to position: "<<itlow->first<<" , "<<itlow->second<<'\n'; 35 mymap.insert(itlow, map<char,int>::value_type(c, 160+c)); 36 for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it) 37 std::cout << it->first << " => " << it->second << '\n'; 38 cout<<endl; 39 } 42 return 0; 43 }
输出结果:
1 a => 20 2 b => 50 3 c => 80 4 d => 80 5 e => 100 6 7 a => 20 8 b => 50 9 c => 80 10 d => 80 11 e => 100 12 13 d //并没有成功插入,d的value还是原来的80 14 insert d to position: d , 80 15 a => 20 16 b => 50 17 c => 80 18 d => 80 19 e => 100 20 21 z //插入位置在map.end 22 a => 20 23 b => 50 24 c => 80 25 d => 80 26 e => 100 27 z => 282 28 29 x 30 insert x to position: z , 282 31 a => 20 32 b => 50 33 c => 80 34 d => 80 35 e => 100 36 x => 280 37 z => 282
2. map.key_comp(),只有第一个参数小于第二个才返回true。
函数返回值是bool型,输入是两个key值,key_comp()(a,b),当a<b时返回1,否则返回0。
1 #include <iostream> 2 #include <map> 3 using namespace std; 4 int main () 5 { 6 std::map<char,int> mymap; 7 8 mymap['a'] = 20; 9 mymap['c'] = 120; 10 mymap['x']=101; 11 mymap['y']=203; 12 mymap['z']=103; 13 14 std::cout << "mymap contains:\n"; 15 map<char,int>::iterator it = mymap.begin(); 16 for( it = mymap.begin();it!=mymap.end();it++) 17 cout<<it->first<<" => "<<it->second<<'\n'; 18 cout<<endl; 19 20 map<char,int>::iterator pit = mymap.begin(); 21 pit++; 22 pit++; //pit指向第三个元素map<x,101> 23 24 it = mymap.begin(); 25 for( it = mymap.begin();it!=mymap.end();it++) 26 { 27 cout<<"key comp result: "<<mymap.key_comp()(it->first, pit->first)<<endl; 28 } 29 cout<<endl; 30 return 0; 31 }
结果:
1 mymap contains: 2 a => 20 3 c => 120 4 x => 101 5 y => 203 6 z => 103 7 8 key comp result: 1 9 key comp result: 1 10 key comp result: 0 //此时it=pit 11 key comp result: 0 12 key comp result: 0
-----------2018.03.09--------------------
db_feature.insert(std::pair<int, std::vector<std::vector<unsigned char>> >(id,feature) ); //如果id已经存在,不会成功插入 db_feature[id] = feature; //如果id已经存在,修改key=id的value
----------2019.01.08---------------------
map最后一个元素访问并删除
1. 直接调stl函数
*(map.rbegin()); //map最后一个元素
访问并删除:
key = m_right.rbegin()->first; //map倒叙第一个元素(也就是正序最后一个) value = m_right.rbegin()->second; m_right.erase(key); //map的key是唯一的,可以按key删除 //m_right.erase(m_right.rbegin()); //这样删除会报错
注意这个rbegin是一个反向迭代器:
// map<TreeNode*, int>::iterator it = m_right.rbegin(); //这样的索引是错的 map<TreeNode*, int>::reverse_iterator it = m_right.rbegin();
这也解释了为什么不能用rbegin()删除元素,因为map.erase不支持反向迭代器的删除:
2. 使用end再自减迭代器
auto it = m_right.end(); //it指向最后一个元素的下一个地址 it--; //it指向最后一个元素 root = it->first; s = it->second; m_right.erase(it); //删除迭代器指向的元素
关于map.end(), c++参考里描述是指向“past-the-end element”,stackoverflow对这个past-the-end的解释
---------------2019.02.27----------------------------