容器总结——关联式容器


  1. Set Multiset    #include<set>   关联式容器

自动将元素排序,set中不许重复,multiset允许。只要是可以依据某准则比较的任意类型T都可以成为setmultiset元素类型。可有可无的第二实参定义排序准则,默认less<>

排序准则:1.非对称2.可传递3.非自反4.等效传递性。(<=不满足)

 

特性:

Setmultiset通常以平衡二叉树完成。主要优点:查找元素拥有良好效能,对数复杂度。

不能直接改变元素值,这会打乱原本的顺序。要改变先删除再插入新元素。对于multisetc++11保证等价元素的相对次序不变。

1.setmultiset不提供任何操作函数直接访问元素2.从迭代器看,元素是常量

    1. 创建复制和销毁

      两种方式定义准则:

      Template第二参数可以定义排序准则std::greater<int>排序准则就是类型的一部分,只有排序准则相同的容器才能被合并。这是排序准则的通常指定法。

      还可以以构造函数参数定义之,运行期才获得排序准则,且准则不同(数据类型必同)。

       

      否则默认less<>,此时检验相等if(!(elem1<elem2)||(elem2<elem1)):

      1.只需传递一个实参作为排序准则2.不必针对元素提供operator==3.可以对相等性有截然相反的定义。

      如果用==比较,则元素类型必须提供operator==

    2. 非更易操作

      返回比较准则。元素比较只适用于类型相同的容器(元素类型,排序准则类型)

      比较动作是以字典顺序检查,如果要比较不同类型容器,应用比较算法。

    3. 特殊查找函数

      是同名STL算法的特殊版本,采用这些算法可获得对数复杂度,而STL算法提供线性复杂度:count(val)find(val)lower_bound(val)upper_bound(val)equel_range(ral)

    4. 赋值

      赋值操作两端容器必须同类型。否则,准则本身一并被赋值。

    5. 迭代器相关函数

      只能Range-based for、迭代器。返回双向迭代器反向迭代器

      从迭代器看,元素是常量,无法使用任何更易型算法,只能使用相关成员函数。

    6. 元素的安插和移除

      保证:1.迭代器必须指向一个合法位置2.区间的其实位置不能在位置结束之后

      安插多个元素时调用一次更快

      安插的都是拷贝,安插和删除返回类型不尽相同。返回接口P323

      删除某值用成员函数find()小心迭代器删除陷阱

      以迭代器为元素的setC++提供了erase()的重载。

    7. 运行期指定排序准则

P328例子·

  1. MapMultimap     #include<map>

key/value pair当做元素进行管理。根据key的排序准则自动为元素排序

Keyvalue必须是copyablemovableKey必须是comparable

可有可无的第三实参定义排序准则,默认less<>

对于multimapc++11保证等价元素的相对次序不变。

 

特性:MapMultimap通常以平衡二叉树完成。可以将setmultiset看做特殊的MapMultimap,只不过valuekey是同一对象。MapMultimap拥有setmultiset的所有能力和操作。差别:1.元素是pair2.map可作为关联式数组。从迭代器看,key是常量,value可以修改(前提是value不是const)。

    1. 创建复制和销毁、非更易操作、赋值和Set Multise相似。

    2. 特殊查找

      查找keySet Multise一样。

      不能以find查找拥有特定value的元素:1.STL算法find_if()2.自己写一个循环。如果想用该循环删除元素,小心迭代器删除陷阱。

    3. 迭代器函数和元素访问

      只能Range-based for、迭代器。返回双向迭代器反向迭代器

      Map提供at()[ ]直接访问元素。

      如果使用算法和lambda来操作map元素必须明确声明元素类型:pairvalue::typeP338

      可以修改value,一定要修改key,自己定义个泛型函数P339

      coll[“new”]=coll[“old”];coll.erase(“old”);8.5

    4. 元素安插和移除

对于multimapc++11保证等价元素的相对次序不变,而新增元素放在既有等价元素群的末尾。Key被视为常量,要么提供正确类型,要么提供显式或隐式转换。

最方便的是初值列的形式:coll.insert({“sdfa”,22.3})

还有3种方法:1.value_type2.pair<>3.make_pair()

返回bool可以检查是否成功

删除某value值用成员函数find()小心迭代器删除陷阱C++11和之前的方法

    1. map视为关联式数组

      C[key]=value;安插一个带key的元素,若存在返回指向keyreference

      别对cout用,该方法安插慢,最方便的是初值列。

      c.at(key) 返回指向keyreference

    2. 运用mapstring于运行期间指定排序准则P351

      Multimap是用来表现字典的一个典型容器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值