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

std::

multiset::insert

公众成员函数  <set>
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);

插入元素

通过插入新元素来扩展容器,通过插入元素的数量有效地增加容器的大小。

在内部,multiset容器按照其比较对象指定的标准对其所有元素排序。元素总是按照此顺序插入到其各自的位置。
C++98
不能保证等效元素的相对顺序。
C++11
等价元素的相对顺序保持不变,新插入的元素跟随着容器中已经存在的等价元素。

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

☲  参数


val
要复制(或移动)到插入元素中的值。
成员类型value_type是容器中元素的类型,在multiset中定义为它的第一个模板形参(T)的别名。
position
提示元素可以插入的位置

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

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

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

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

函数模板实参InputIterator应该是一个输入迭代器类型, 它指向可以构造value_type对象类型的元素。
il
一个初始化列表对象。这些元素的副本被插入容器中。
这些对象是由初始化器列表声明符自动构造的。
成员类型value_type是容器中元素的类型,在 multiset中定义为其第一个模板形参(T)的别名。

☉  返回值



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

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

☣  示例



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

int main ()
{
  std::multiset<int> mymultiset;
  std::multiset<int>::iterator it;

  // set some initial values:
  for (int i=1; i<=5; i++) mymultiset.insert(i*10);  // 10 20 30 40 50

  it=mymultiset.insert(25);

  it=mymultiset.insert (it,27);    // max efficiency inserting
  it=mymultiset.insert (it,29);    // max efficiency inserting
  it=mymultiset.insert (it,24);    // no max efficiency inserting (24<29)

  int myints[]= {5,10,15};
  mymultiset.insert (myints,myints+3);

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

  return 0;
}

输出:
myset contains: 5 10 15 20 24 25 26 30 40 50

✥ 复杂度



对于第一个版本( insert(x) ),是对数的。

对于第二个版本(insert(position,x)),一般是对数的,但如果x插入到按位置指向的元素之后,则是分摊常量。

第三个版本(insert (first,last))Nlog(size+ N)一般(Nfirst lastv之间的距离,size 插入之前容器的大小), 但是如果firstlast之间的元素,已经根据使用的容器相同的排序准则排序,则线性。

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

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

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

☣ 迭代器的有效性



不变。

⇄ 数据竞争


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

☂ 异常安全性



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

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

🍄  另请参阅



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

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