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

std::

map::insert

公众成员函数  <map>
C++98 single element (1)
pair<iterator,bool> 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);

插入元素

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

由于map中的元素都是唯一的,插入操作检查插入的每个元素是否与容器中已经存在的元素相等, 如果相等,则不插入元素,并返回现有元素的迭代器(如果函数返回一个值)。

有关允许重复元素的类似容器,请参阅multimap
map中插入元素的另一种方法是使用成员函数map::operator[]
在内部,map容器保持其所有元素按照比较对象指定的标准排序。 元素总是按照这种顺序插入到其各自的位置。

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

☲  参数


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

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

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

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

注意,这只是一个提示,并不强制将新元素插入到map容器中的那个位置 (map中的元素总是遵循特定的顺序,这取决于它们的键))。

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

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

☉  返回值



单个元素版本(1)返回一个pair, 其成员pair::first被设置为指向新插入元素或映射中已经存在的等效元素的迭代器。 pair中的第二个元素如果插入了新元素则设置为true,如果已经存在等效元素则设置为false

hint(2)的版本返回一个迭代器,指向新插入的元素或映射中已经有等价键的元素。

成员类型迭代器是指向元素的双向迭代器类型。 Pair是在<utility>中声明的类模板(参见Pair)。

☣  示例



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

int main ()
{
  std::map<char,int> mymap;

  // first insert function version (single parameter):
  mymap.insert ( std::pair<char,int>('a',100) );
  mymap.insert ( std::pair<char,int>('z',200) );

  std::pair<std::map<char,int>::iterator,bool> ret;
  ret = mymap.insert ( std::pair<char,int>('z',500) );
  if (ret.second==false) {
    std::cout << "element 'z' already existed";
    std::cout << " with a value of " << ret.first->second << '\n';
  }

  // second insert function version (with hint position):
  std::map<char,int>::iterator it = mymap.begin();
  mymap.insert (it, std::pair<char,int>('b',300));  // max efficiency inserting
  mymap.insert (it, std::pair<char,int>('c',400));  // no max efficiency inserting

  // third insert function version (range insertion):
  std::map<char,int> anothermap;
  anothermap.insert(mymap.begin(),mymap.find('c'));

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

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

  return 0;
}

输出:
element 'z' already existed with a value of 200
mymap contains:
a => 100
b => 300
c => 400
z => 200
anothermap contains:
a => 100
b => 300

✥ 复杂度



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

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

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

☣ 迭代器的有效性



不变。

⇄ 数据竞争


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

☂ 异常安全性



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

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

🍄  另请参阅



map::erase 删除元素(公众成员函数)
map::find 获取元素迭代器(公众成员函数)
map::operator[] 访问元素(公众成员函数)

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