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

std::

multimap::insert

公众成员函数  <map>
C++98 single element (1)
iterator insert (const value_type& val);
with hint(2)
iterator insert (iterator position, const value_type& val);
range (3)
template <class InputIterator>
  void insert (InputIterator first, InputIterator last);

插入元素

通过插入新元素来扩展容器。元素数量增加.

在内部,multimap容器按照其比较对象指定的标准对其所有元素按键进行排序。元素总是按照此顺序插入到其各自的位置。

C++98: 不能保证等效元素的相对顺序.

C++11: 具有等效键的元素的相对顺序被保留,新插入的元素紧随容器中已经具有等效键的元素。

参数决定如何插入多少个元素以及初始化它们的值:

☲  参数


val
要复制(或移动)到插入元素中的值。
成员类型value_type是容器中元素的类型, 在multimap中定义为pair<const key_type,multimapped_type>(参见multimap成员类型)。
C++98: 模板参数P应该是一个可转换为value_type的类型。
C++14: 只有当std::is_constructible<value_type,P&&>true时, 调用才会接受类型为P&&的参数的签名

如果P被实例化为引用类型,则复制实参。
position
元素可插入位置的提示。

C++98: 如果位置指向插入元素之前的元素,则该函数优化其插入时间。

C++11: 如果位置指向插入元素后面的元素(如果是最后一个元素, 则指向结尾),则该函数优化其插入时间。

注意,这只是一个提示,并不强制将新元素插入到multimap容器中的那个位置 (multimap中的元素总是遵循特定的顺序)成员类型iteratorconst_iterator 在multimap中定义为指向元素的双向迭代器类型。。

成员类型iteratorconst_iteratormultimap中定义为指向元素的双向迭代器类型。
first, last
指定元素范围的迭代器。将[first,last)范围内元素的副本插入容器中。
使用的范围是[first,last),它包括firstlast之间的所有元素, 包括first指向的元素,但不包括last指向的元素。

函数模板实参InputIterator应该是一个输入迭代器类型, 它指向可以构造value_type对象类型的元素。
il
一个初始化列表对象。这些元素的副本被插入容器中。
这些对象是由初始化器列表声明符自动构造的。
成员类型value_type是容器中包含的元素的类型, 在multimap中定义为pair<const key_type,mapped_type>(参见multimap成员类型)。

☉  返回值



在返回值的版本中,这是一个指向multiset中新插入元素的迭代器。

成员类型iterator是指向元素的双向迭代器类型。

☣  示例



// multimap::insert (C++98)
#include <iostream>
#include <map>

int main ()
{
  std::multimap<char,int> mymultimap;
  std::multimap<char,int>::iterator it;

  // first insert function version (single parameter):
  mymultimap.insert ( std::pair<char,int>('a',100) );
  mymultimap.insert ( std::pair<char,int>('z',150) );
  it=mymultimap.insert ( std::pair<char,int>('b',75) );

  // second insert function version (with hint position):
  mymultimap.insert (it, std::pair<char,int>('c',300));  // max efficiency inserting
  mymultimap.insert (it, std::pair<char,int>('z',400));  // no max efficiency inserting

  // third insert function version (range insertion):
  std::multimap<char,int> anothermultimap;
  anothermultimap.insert(mymultimap.begin(),mymultimap.find('c'));

  // showing contents:
  std::cout << "mymultimap contains:\n";
  for (it=mymultimap.begin(); it!=mymultimap.end(); ++it)
    std::cout << (*it).first << " => " << (*it).second << '\n';

  std::cout << "anothermultimap contains:\n";
  for (it=anothermultimap.begin(); it!=anothermultimap.end(); ++it)
    std::cout << (*it).first << " => " << (*it).second << '\n';

  return 0;
}

输出:
mymultimap contains:
a => 100
b => 75
c => 300
z => 400
z => 150
anothermultimap contains:
a => 100
b => 75

✥ 复杂度



如果只插入一个元素,一般大小为对数,但如果给出一个提示,给出的位置是最优的,则平摊常数。。

C++98: 如果插入N个元素,一般为Nlog(size+N),但如果元素已经按照容器使用的相同排序标准排序, 则为线性 size+N

C++11: 如果插入N个元素,则为Nlog(size+N)。如果范围已经排序,实现可能会优化。

☣ 迭代器的有效性



不变。

⇄ 数据竞争


容器修改。
并发地访问现有元素是安全的,但迭代容器中的范围则不安全。

☂ 异常安全性



如果只插入一个元素,在发生异常时容器不会发生任何变化(强保证)。

否则,容器将保证以有效状态结束(基本保证)。
如果元素结构的适当参数不支持allocator_traits::construct,或者指定了无效的位置或范围,它将导致未定义行为。

🍄  另请参阅



multimap::erase 删除元素(公众成员函数)
multimap::find 获取元素迭代器(公众成员函数)

联系我们 免责声明 关于CandCplus 网站地图