C++ Reference: Standard C++ Library reference: Containers: map: multimap: multimap

C++官网参考链接:https://cplusplus.com/reference/map/multimap/multimap/

公有成员函数 
<map>
std::multimap::multimap
C++98
empty (1)    
explicit multimap (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());
range (2)    
template <class InputIterator>  multimap (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());
copy (3)    
multimap (const multimap& x);
C++11
empty (1)    
explicit multimap (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());
explicit multimap (const allocator_type& alloc);
range (2)    
template <class InputIterator>  multimap (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& = allocator_type());
copy (3)    
multimap (const multimap& x);
multimap (const multimap& x, const allocator_type& alloc);
move (4)    
multimap (multimap&& x);
multimap (multimap&& x, const allocator_type& alloc);
initializer list (5)    
multimap (initializer_list<value_type> il, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());
C++14
empty (1)    
multimap();explicit multimap (const key_compare& comp, const allocator_type& alloc = allocator_type());
explicit multimap (const allocator_type& alloc);
range (2)    
template <class InputIterator>  multimap (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& = allocator_type());
template <class InputIterator>  multimap (InputIterator first, InputIterator last, const allocator_type& = allocator_type());
copy (3)    
multimap (const multimap& x);
multimap (const multimap& x, const allocator_type& alloc);
move (4)    
multimap (multimap&& x);
multimap (multimap&& x, const allocator_type& alloc);
initializer list (5)    
multimap (initializer_list<value_type> il, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());
multimap (initializer_list<value_type> il, const allocator_type& alloc = allocator_type());
构造mulitimap
构造一个multimap容器对象,根据使用的构造函数版本初始化其内容:
C++98
(1)空容器构造函数(默认构造函数) 
构造一个empty容器,不包含任何元素。
(2)范围构造函数
构造一个包含与范围[first,last)相同数量元素的容器,每个元素都从该范围内的相应元素构造。
(3)复制构造函数
用x中每个元素的副本构造一个容器。
容器保留了alloc和comp的内部副本,它们在容器的整个生命周期中用于分配存储空间和对元素排序。
复制构造函数(3)创建一个容器,该容器保存并使用x的allocator和比较对象(comparison object)的副本。
使用这个内部allocator(internal allocator)来分配元素的存储空间。
元素是根据比较对象(comparison object)排序的。
C++11
(1)空容器构造函数(默认构造函数) 
构造一个empty容器,不包含任何元素。
(2)范围构造函数
构造一个包含与范围[first,last)相同数量元素的容器,每个元素的位置都是由该范围内的相应元素构造的。
(3)复制构造函数(和使用allocator复制) 
用x中每个元素的副本构造一个容器。
(4)移动构造函数(和使用allocator移动) 
构造一个获取x元素的容器。
如果指定了alloc且与x的allocator不同,则移动元素。否则,不构造任何元素(它们的所有权直接转移)。
x处于未指定但有效的状态。
(5)初始化列表构造函数
用il中每个元素的副本构造一个容器。
容器保留了一个alloc的内部副本,该副本用于为其元素分配和释放存储空间,以及构造和销毁它们(由其allocator_traits指定)。
如果没有alloc实参传递给构造函数,则使用默认构造的allocator,以下情况除外: 
复制构造函数(3,第一个签名)创建一个容器,该容器保存并使用通过在x的allocator上调用适当的selected_on_container_copy_construction特性返回的allocator的副本。
移动构造函数(4,第一个签名)获取x的allocator。
容器还保留comp(或x的比较对象(comparison object))的内部副本,用于建立容器中元素的顺序,并检查具有等价键的元素。
通过使用适当的实参调用allocator_traits::construct来复制、移动或以其他方式构造所有元素。
元素是根据比较对象(comparison object)排序的。如果将具有等价键的元素传递给构造函数,则保留它们的相对顺序。

形参 
comp
二元谓词,接受两个元素键作为实参,如果第一个实参按照它定义的严格弱顺序排在第二个实参之前,则返回true,否则返回false。
这应该是一个函数指针或函数对象。
成员类型key_compare是容器使用的内部比较对象类型,在multimap中定义为其第三个模板形参(Compare)的别名。
如果key_compare使用默认的less(没有状态),则此形参不相关。
alloc
allocator对象。
容器保留并使用这个allocator的内部副本。
成员类型allocator_type是容器使用的内部allocator类型,在multimap中定义为其第四个模板形参(Alloc)的别名。
如果allocator_type是默认allocator的实例化(没有状态),则此形参不相关。
first,last 
输入iterators(Input iterators)到范围内的初始和最终位置。使用的范围是[first,last),它包括first和last之间的所有元素,包括由first指向的元素,但不包括由last指向的元素。
函数模板实参InputIterator应该是一个输入iterator(input iterator)类型,它指向可以构造value_type对象的类型元素(在multimap中,value_type是pair<const key_type, mapped_type>的别名)。
x
另一个相同类型的multimap对象(具有相同的类模板形参Key、T、Compare和Alloc),其内容被复制或获取。
il 
一个initializer_list对象。
这些对象是由初始化器列表声明器自动构造的。
成员类型value_type是容器中元素的类型,在multimap中定义为pair<const key_type, mapped_type>的别名 (参见multimap类型(multimap types))。

用例
// constructing multimaps
#include <iostream>
#include <map>

bool fncomp (char lhs, char rhs) {return lhs<rhs;}

struct classcomp {
  bool operator() (const char& lhs, const char& rhs) const
  {return lhs<rhs;}
};

int main ()
{
  std::multimap<char,int> first;

  first.insert(std::pair<char,int>('a',10));
  first.insert(std::pair<char,int>('b',15));
  first.insert(std::pair<char,int>('b',20));
  first.insert(std::pair<char,int>('c',25));

  std::multimap<char,int> second (first.begin(),first.end());

  std::multimap<char,int> third (second);

  std::multimap<char,int,classcomp> fourth;                 // class as Compare

  bool(*fn_pt)(char,char) = fncomp;
  std::multimap<char,int,bool(*)(char,char)> fifth (fn_pt); // function pointer as comp

  return 0;

该代码不产生任何输出,但演示了构造multimap容器的一些方法。

复杂度
对于空构造函数(1)和移动构造函数(4)都是常量(除非alloc不同于x的allocator)。
对于所有其他情况,如果元素已经按照相同的标准排序,则iterators(复制构造)之间的距离的线性。对于未排序的序列,在该距离(排序,复制构造)内的线性(N*logN)。

iterator的有效性
移动构造函数(4),如果元素被移动,则所有与x相关的iterators、pointers和references都将失效。

数据竞争
所有复制的元素都被访问。
移动构造函数(4)修改x。

异常安全
强保证在抛出异常的情况下没有影响。
如果元素结构的适当实参不支持allocator_traits::construct,或者由[first,last)指定的范围无效,则会导致未定义的行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值