-
Set 和Multiset #include<set> 关联式容器
自动将元素排序,set中不许重复,multiset允许。只要是可以依据某准则比较的任意类型T都可以成为set和multiset元素类型。可有可无的第二实参定义排序准则,默认less<>。
排序准则:1.非对称2.可传递3.非自反4.等效传递性。(<=不满足)
特性:
Set和multiset通常以平衡二叉树完成。主要优点:查找元素拥有良好效能,对数复杂度。
不能直接改变元素值,这会打乱原本的顺序。要改变先删除再插入新元素。对于multiset,c++11保证等价元素的相对次序不变。
1.set和multiset不提供任何操作函数直接访问元素2.从迭代器看,元素是常量
-
创建复制和销毁
两种方式定义准则:
Template第二参数可以定义排序准则std::greater<int>排序准则就是类型的一部分,只有排序准则相同的容器才能被合并。这是排序准则的通常指定法。
还可以以构造函数参数定义之,运行期才获得排序准则,且准则不同(数据类型必同)。
否则默认less<>,此时检验相等if(!(elem1<elem2)||(elem2<elem1)):
1.只需传递一个实参作为排序准则2.不必针对元素提供operator==3.可以对相等性有截然相反的定义。
如果用==比较,则元素类型必须提供operator==。
-
非更易操作
返回比较准则。元素比较只适用于类型相同的容器(元素类型,排序准则类型)
比较动作是以字典顺序检查,如果要比较不同类型容器,应用比较算法。
-
特殊查找函数
是同名STL算法的特殊版本,采用这些算法可获得对数复杂度,而STL算法提供线性复杂度:count(val)、find(val)、lower_bound(val)、upper_bound(val)、equel_range(ral)
-
赋值
赋值操作两端容器必须同类型。否则,准则本身一并被赋值。
-
迭代器相关函数
只能Range-based for、迭代器。返回双向迭代器、反向迭代器。
从迭代器看,元素是常量,无法使用任何更易型算法,只能使用相关成员函数。
-
元素的安插和移除
保证:1.迭代器必须指向一个合法位置2.区间的其实位置不能在位置结束之后
安插多个元素时调用一次更快
安插的都是拷贝,安插和删除返回类型不尽相同。返回接口P323。
删除某值用成员函数find(),小心迭代器删除陷阱。
以迭代器为元素的set,C++提供了erase()的重载。
-
运行期指定排序准则
-
P328例子·
-
Map和Multimap #include<map>
将key/value pair当做元素进行管理。根据key的排序准则自动为元素排序
Key和value必须是copyable或movable。Key必须是comparable。
可有可无的第三实参定义排序准则,默认less<>。
对于multimap,c++11保证等价元素的相对次序不变。
特性:Map和Multimap通常以平衡二叉树完成。可以将set和multiset看做特殊的Map和Multimap,只不过value和key是同一对象。Map和Multimap拥有set和multiset的所有能力和操作。差别:1.元素是pair2.map可作为关联式数组。从迭代器看,key是常量,value可以修改(前提是value不是const)。
-
创建复制和销毁、非更易操作、赋值和Set 和Multise相似。
-
特殊查找
查找key与Set 和Multise一样。
不能以find查找拥有特定value的元素:1.STL算法find_if()2.自己写一个循环。如果想用该循环删除元素,小心迭代器删除陷阱。
-
迭代器函数和元素访问
只能Range-based for、迭代器。返回双向迭代器、反向迭代器。
Map提供at()及[ ]直接访问元素。
如果使用算法和lambda来操作map元素必须明确声明元素类型:pair、value::typeP338
可以修改value,一定要修改key,自己定义个泛型函数P339
或coll[“new”]=coll[“old”];coll.erase(“old”);见8.5
-
元素安插和移除
-
对于multimap,c++11保证等价元素的相对次序不变,而新增元素放在既有等价元素群的末尾。Key被视为常量,要么提供正确类型,要么提供显式或隐式转换。
最方便的是初值列的形式:coll.insert({“sdfa”,22.3})
还有3种方法:1.用value_type2.用pair<>3.用make_pair()
返回bool可以检查是否成功
删除某value值用成员函数find(),小心迭代器删除陷阱。C++11和之前的方法
-
将map视为关联式数组
C[key]=value;安插一个带key的元素,若存在返回指向key的reference。
别对cout用,该方法安插慢,最方便的是初值列。
c.at(key) 返回指向key的reference。
-
运用map、string于运行期间指定排序准则P351
Multimap是用来表现字典的一个典型容器。
-