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);
|
C++11 |
single element (1) |
iterator insert (const value_type& val);
iterator insert (value_type&& val);
|
|
with hint(2) |
iterator insert (const_iterator position, const value_type& val);
iterator insert (const_iterator position, value_type&& val);
|
|
range (3) |
template <class InputIterator>
void insert (InputIterator first, InputIterator last);
|
|
initializer list (4) |
void insert (initializer_list<value_type> il);
|
插入元素
通过插入新元素来扩展容器,通过插入元素的数量有效地增加容器的大小。
在内部,
multiset容器按照其比较对象指定的标准对其所有元素排序。元素总是按照此顺序插入到其各自的位置。
- C++98
-
不能保证等效元素的相对顺序。
- C++11
-
等价元素的相对顺序保持不变,新插入的元素跟随着容器中已经存在的等价元素。
参数决定如何插入多少个元素以及初始化它们的值:
☲ 参数
-
val
-
要复制(或移动)到插入元素中的值。
成员类型value_type是容器中元素的类型,在multiset中定义为它的第一个模板形参(T)的别名。
-
position
-
提示元素可以插入的位置
C++98: 如果位置指向插入元素之前的元素,则该函数优化其插入时间。
C++11: 如果位置指向插入元素后面的元素(如果是最后一个元素,
则指向结尾),则该函数优化其插入时间。
注意,这只是一个提示,并不强制将新元素插入到multiset容器中的那个位置
(multiset中的元素总是遵循特定的顺序)。
成员类型iterator和const_iterator在multiset中定义为指向元素的双向迭代器类型。
-
first, last
-
指定元素范围的迭代器。将[first,last)范围内元素的副本插入容器中。
使用的范围是[first,last),它包括first和last之间的所有元素,
包括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)一般(
N是
first 和
lastv之间的距离,
size 插入之前容器的大小),
但是如果
first和
last之间的元素,已经根据使用的容器相同的排序准则排序,则线性。
如果插入单个元素,大小一般为对数,但如果给出提示,且给出的位置是最优的,则平摊常数。
C++98: 如果插入
N个元素,一般为
Nlog(size+N),但如果元素已经按照容器使用的相同排序标准排序,
则为线性
size+N。
C++11: 如果插入
N个元素,则为
Nlog(size+N)。如果范围已经排序,实现可能会优化。
☣ 迭代器的有效性
不变。
⇄ 数据竞争
容器修改。
并发地访问现有元素是安全的,但迭代容器中的范围则不安全。
☂ 异常安全性
如果只插入一个元素,在发生异常时容器不会发生任何变化(强保证)。
否则,容器将保证以有效状态结束(基本保证)。
如果元素结构的适当参数不支持
allocator_traits::construct,或者指定了无效的位置,它将导致未定义行为。
🍄 另请参阅
multiset::erase |
删除元素(公众成员函数) |
multiset::find |
获取元素迭代器(公众成员函数) |