c/c++ 标准库 map set 详细讲解及使用实例分析
标准库 map set 大锅炖一,关联容器有哪些按关键字有序保存元素 map 保存key和value set 只保存key mulutimap key可以重复出现 multiset key可以重复出现 无序集合 unordered_map 用哈希函数做成的map unordered_set 用哈希函数做成的set unordered_mulutimap key可以重复出现 unordered_multiset key可以重复出现 二,关联容器的类型别名类型别名 功能描述 key_type 关键字(key)的类型 value_type set的话,和key_type一样;map的话,是个pair mapped_type 只适用于map,值(value)的类型 set set map map //只有map才有mapped_type map 三,关联容器的迭代器当解一个关联容器的迭代器,会得到一个类型为容器的value_type的值的引用。解一个map的迭代器,得到的是pair,key是const的,不可以更改。 解一个set的迭代器,得到的是key也是const的,不可以更改。 map auto map_it = cnt.begin(); //map_it->first = "new key";//错误,first为const ++map_it->second; cout << map_it->second << endl;//2 set set //*set_it = 10;//错误,不可以改变set的key 四,遍历关联容器当使用迭代器遍历map,multimap,set,multiset时,迭代器按关键字升序遍历元素。 map auto map_it = cnt.cbegin(); while(map_it != cnt.cend()){ cout << map_it->first << ":" << map_it->second << endl; ++map_it; } for(auto &s : cnt){ cout << s.first << ":" << s.second << endl; } 五,对关联容器使用泛型算法通常不对关联容器使用泛型算法,因为关联容器有key为const特性,很多算法不适用 关联容器可用于只读算法,但是这些算法都需要搜索序列,比如find算法。但是关联容器有关键字,所以还莫不如用关联容器自己的find成员方法来的效率高。 实际中,一般对关联容器,使用copy算法比较多 multiset vector //copy(v.begin(),v.end(),inserter(c,c.end()));//OK //copy(v.begin(),back_inserter(c));//NG,关联容器没有push_back //copy(c.begin(),c.end(),inserter(v,v.end()));//OK,并且c的begin到end时拍好序的 copy(c.begin(),back_inserter(v));//OK for(auto &s : c){ cout << s << " "; } cout << endl; for(auto &s : v){ cout << s << " "; } cout << endl; 小例子索引代码块 功能描述 test1 关联容器的别名 test2 解关联容器的迭代器 test3 遍历关联容器 test4 对关联容器通用算法 小例子:#include #include #include #include using namespace std; int main(){ //test1 关联容器的别名 /* set set map */ //test2 解关联容器的迭代器 /* map set //*set_it = 10;//错误,不可以改变set的key */ //test3 遍历关联容器 /* map map while(map_it != cnt.cend()){ cout << map_it->first << ":" << map_it->second << endl; ++map_it; } for(auto &s : cnt){ cout << s.first << ":" << s.second << endl; } auto it = cnt.begin(); pair */ //test4 关联容器的通用算法 multiset 序的 copy(c.begin(),back_inserter(v)); for(auto &s : c){ cout << s << " "; } cout << endl; for(auto &s : v){ cout << s << " "; } cout << endl; return 0; } github完整代码 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |