Home C&C++函数库 c++ 语法 程序源码 Linux C库

std::

multimap::multimap

公众成员函数  <map>

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);

构建multimap

构造一个multimap容器对象,根据使用的构造函数版本初始化它的内容:

C++98:
(1)空容器构造函数(默认构造函数)
构造一个空容器,没有元素。

(2)范围构造函数
构造一个容器,其中包含与范围[first,last)相同数量的元素, 每个元素都是由该范围内的相应元素放置构造的。

(3)拷贝构造函数
构造一个容器,其中包含x中每个元素的副本。
容器保留一个alloccomp的内部副本,它们用于在容器的整个生命周期内分配存储空间和对元素进行排序。

复制构造函数(3)创建一个容器,该容器保存并使用x的分配器和比较对象的副本。

元素的存储是使用这个内部分配器分配的。

元素是根据比较对象排序的。

☲  参数


comp
采用两个元素键作为参数的二元谓词,如果第一个参数按照其定义的严格弱顺序在第二个参数之前, 则返回true,否则返回false
这应该是一个函数指针或函数对象。
成员类型key_compare是容器使用的内部比较对象类型, 在multimap中定义为它的第三个模板形参(Compare)的别名。
如果key_compare使用默认的less(没有状态),则此参数不相关。

alloc
分配器对象。
容器保存并使用这个分配器的内部副本.
成员类型allocator_type是容器使用的内部分配器类型, 在multimap中定义为它的第四个模板参数(Alloc)的别名。
如果allocator_type是默认分配器(没有状态)的实例化,则忽略考虑.

first, last
输入迭代器初始和最终位置的范围。
使用的范围是[first,last),它包括firstlast之间的所有元素, 包括first所指向的元素,但不包括last所指向的元素。
函数模板实参InputIterator必须是一个输入迭代器类型, 该类型指向可以构造value_type对象的类型的元素, (在multimap中,value_typepair<const key_type, mapped_type>的别名)。

x
另一个相同类型的multimap对象(具有相同的类模板参数Key,T,CompareAlloc),其内容要么被复制要么被获取。

il
一个initializer_list对象。
这些对象是由初始化列表声明符自动构造的。
成员类型value_type是容器中元素的类型,在multimap中定义为 pair<const key_type, mapped_type>的别名(参见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的分配器)是常量。
对于所有其他情况,如果元素已经按照相同的标准排序,则迭代器之间的距离为线性(复制结构)。 对于未排序的序列,在该距离内线性(N*logN)(排序,复制构造)。

☣ 迭代器的有效性



移动构造函数(4),如果元素被移动,将使所有与x相关的迭代器、指针和引用失效。

⇄ 数据竞争


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

☂ 异常安全性



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

🍄  另请参阅



multimap::operator= 内容赋值 (公众成员函数)
multimap::insert 插入元素 (公众成员函数)