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

std::

set::insert

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

插入元素

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

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

有关允许重复元素的类似容器,请参阅multiset。

在内部,set容器保持其所有元素按照比较对象指定的标准排序。 元素总是按照这种顺序插入到其各自的位置。

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

☲  参数


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

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

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

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

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

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

☉  返回值



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

hint(2)的版本返回一个迭代器,该迭代器要么指向新插入的元素, 要么指向集合中已经具有相同值的元素。

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

☣  示例



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

int main ()
{
  std::set<int> myset;
  std::set<int>::iterator it;
  std::pair<std::set<int>::iterator,bool> ret;

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

  ret = myset.insert(20);               // no new element inserted

  if (ret.second==false) it=ret.first;  // "it" now points to element 20

  myset.insert (it,25);                 // max efficiency inserting
  myset.insert (it,24);                 // max efficiency inserting
  myset.insert (it,26);                 // no max efficiency inserting

  int myints[]= {5,10,15};              // 10 already in set, not inserted
  myset.insert (myints,myints+3);

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

  return 0;
}

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

✥ 复杂度



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

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

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

☣ 迭代器的有效性



不变。

⇄ 数据竞争


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

☂ 异常安全性



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

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

🍄  另请参阅



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

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