C++的关联容器主要是两大类map和set算法
咱们知道谈到C++容器时,咱们会说到 顺序容器(Sequence containers),关联容器(Associative containers),无序关联容器(Unordered associative containers)以及容器适配器(Container adaptors),数据结构
另外,我相信,这些抽象的容器概念,应该是全部高级语言都有的。本文重点阐述关联容器。函数
Associative containers implement sorted data structures that can be quickly searched (O(log n) complexity).测试
关联容器实现了能够快速搜索(O(log n)复杂度)的排序数据结构。ui
主要就是 set、map、multiset和multimap。.net
map is a sorted associative container that contains key-value pairs with unique keys. Keys are sorted by using the comparison function Compare. Search, removal, and insertion operations have logarithmic complexity. Maps are usually implemented as red-black trees。code
map是一个排序的关联容器,它包含具备唯一键的键值对。经过使用Compare函数对键进行排序。搜索、删除和插入操做具备对数复杂度。映射一般被实现为红黑树对象
理解map须要理解键值对、有序、键值惟一以及对数级别的操做。blog
键值对
既然是关联容器,那天然要关联下,这里的关联就是key和value的关联,经过std::map<string,string> mapStr;
这样,咱们就定义了一个key为string ,value为string的map。咱们能够经过中括号直接给键值对赋值:
mapStr["name"] = "lckfa"; mapStr["sexuality"] = "male";
事实上,map的底层是使用pair来实现的,std::pair是一个结构模板,它提供了一种将两个异构对象存储为单个单元的方法。所以还可使用以下代码完成上面的操做:
pair<string,string> pair1("name","lckfa"); pair<string,string> pair2("sexuality","male"); mapStr.insert(pair1); mapStr.insert(pair2);
有序
为了看看map是怎么有序的,咱们先弄个打印函数出来
template<typename Map> void print_map(Map& m){ std::cout << "{ " ; for_each(m.begin(),m.end(),[&](Map::value_type& p){ std::cout << p.first <<":"<<p.second<<' '; }); std::cout << "}" ; }
这个打印函数模板,能够打印任何类型的map。这下不再担忧map的类型改变了。还不会使用labmda表达式的,能够去看个人另外一篇博文,另外value_type能够理解为pair,这里和Map是一个类型。
而后,咱们在以前的map里新增一个键值对
mapStr["sss"] = "sss"; mapStr["aaa"] = "aaa"; mapStr["bbv"] = "bbb";
使用pair,而后insert也行。
而后调用print_map
函数,结果以下:
{ aaa:aaa bbv:bbb name:lckfa sexuality:male sss:sss }
以上结果充分说明 map是按key的升序排列的。
备注,若是你想自定义map的排序方式,能够参考这里
键值惟一
白话就是,这里的key值老是惟一的,那么让咱们来验证下,同时向map里插入相同键值会发生什么:
mapStr["name"] = "lckfa"; mapStr["sexuality"] = "male"; mapStr["name"] = "mal9";
打印结果:
{ name:mal9 sexuality:male }
从结果可知,再从新设置某个key的value后,后一个会覆盖前一个value。
对数级别的复杂度操做
这个就不展开了,有兴趣的能够了解一个红黑树。
std::set is an associative container that contains a sorted set of unique objects of type Key. Sorting is done using the key comparison function Compare. Search, removal, and insertion operations have logarithmic complexity. Sets are usually implemented as red-black trees
set是一个关联容器,它包含一组类型为Key的已排序的唯一对象。排序是使用key的比较函数比较来完成的。搜索、删除和插入操做具备对数复杂度。集合一般被实现为红黑树。
和map同样,除了map的键值对差别,set只有key,这样的差别外,set和map再定义和使用上没有很大的差别。一样的set也具备 key惟一,有序,对数复杂度的特色,这里使用一个统一的代码说明下:
template<typename Set> void print_set(Set& s){ cout << "{ "; for_each(s.begin(),s.end(),[&](Set::key_type k){ std::cout << k <<' '; }); std::cout << "}" ; } std::set<int> setInt; setInt.insert(4); setInt.insert(2); setInt.insert(5); setInt.insert(2); std::set<string> setStr; setStr.insert("hello"); setStr.insert("set"); setStr.insert("world"); setStr.insert("set"); print_set(setInt); print_set(setStr);
测试输出结果:
{ 2 4 5 }{ hello set world }
由结果可知:set的key值也是惟一的,同时按升序排列,若是但愿自定义排列,须要需改比较函数。
小结:本文初略的整理了map和set的基础使用,说明了两者的特性,key惟一,有序,算法对数级。仅仅能做为初学者参考。