std::set::insert
STD::set::插入
std::pair | (1) | |
---|---|---|
std::pair<iterator,bool> insert( value_type&& value | (2) | (since C++11) |
| (3) | |
iterator insert( iterator hint, const value_type& value | (until C++11) | |
iterator insert( const_iterator hint, const value_type& value | (since C++11) | |
iterator insert( const_iterator hint, value_type&& value | (4) | (since C++11) |
template< class InputIt > void insert( InputIt first, InputIt last | (5) | |
void insert( std::initializer_list<value_type> ilist | (6) | (since C++11) |
insert_return_type insert(node_type&& nh | (7) | (since C++17) |
iterator insert(const_iterator hint, node_type&& nh | (8) | (since C++17) |
在容器中插入元素%28s%29,如果容器%27T已经包含具有等效键的元素。
1-2%29次插入value
...
3-4%29次插入value
在尽可能接近的位置上,从C++11%29开始,刚好在%28之前hint
...
5%29插入范围内的元素[first, last)
如果区域中的多个元素具有比较等效的键,则未指定插入了%28挂起的元素。LWG2844%29
6%29从初始化程序列表插入元素ilist
如果区域中的多个元素具有比较等效的键,则未指定插入了%28挂起的元素。LWG2844%29
7%29nh
是空的节点手柄什么都不做。否则,插入nh
在容器中,如果容器%27T已经包含了一个元素,其密钥相当于nh.key()
如果nh
不是空的get_allocator() != nh.get_allocator()
...
8%29nh
是空的节点手柄,什么也不做,并返回结束迭代器。否则,插入nh
在容器中,如果容器%27T已经包含了一个元素,其密钥相当于nh.key()
,并返回指向元素的迭代器,该元素的键等价于nh.key()
%28无论插入是否成功,%29。如果插入成功,nh
,否则它将保留元素的所有权。元素插入的位置尽可能靠近hint
如果nh
不是空的get_allocator() != nh.get_allocator()
...
没有迭代器或引用无效。如果插入成功,则在节点句柄中保存时获得的元素的指针和引用无效,并且在提取该元素之前获得的指针和引用变得有效。%28自C++17%29。
参数
hint | - | iterator, used as a suggestion as to where to start the search (until C++11) iterator to the position before which the new element will be inserted (since C++11) | iterator, used as a suggestion as to where to start the search | (until C++11) | iterator to the position before which the new element will be inserted | (since C++11) |
---|---|---|---|---|---|---|
iterator, used as a suggestion as to where to start the search | (until C++11) | |||||
iterator to the position before which the new element will be inserted | (since C++11) | |||||
value | - | element value to insert | ||||
first, last | - | range of elements to insert | ||||
ilist | - | initializer list to insert the values from | ||||
nh | - | a compatible node handle |
类型要求
-输入必须符合输入器的要求。
返回值
1-2%29将由迭代器组成的一对迭代器返回到插入元素%28或阻止插入%29的元素和bool
值设置为true
如果插入发生了。
3-4%29将迭代器返回到插入的元素或阻止插入的元素。
5-6%29%280%29
7%29返回insert_return_type
成员初始化如下:nh
是空的,inserted
是false
,,,position
是end()
,和node
是空的。否则如果插入发生,inserted
是true
,,,position
指向插入的元素,以及node
是空的。如果插入失败,inserted
是false
,,,node
具有以前的值nh
,和position
指向一个元素,该元素的键等价于nh.key()
...
8%29端迭代器nh
为空,迭代器指向插入的元素(如果发生插入),迭代器指向的元素的键相当于nh.key()
如果失败了。
例外
1-4%29如果任何操作引发异常,则插入无效。
复杂性
容器大小为1-2%29对数,O(log(size()))
...
3-4) Amortized constant if the insertion happens in the position just after the hint, logarithmic in the size of the container otherwise. | (until C++11) |
---|---|
3-4) Amortized constant if the insertion happens in the position just before the hint, logarithmic in the size of the container otherwise. | (since C++11) |
5-6%29O(N*log(size() + N))
,其中N是要插入的元素数。
容器大小为7%29对数,O(log(size()))
...
8%29摊销常数,如果插入发生在刚才的位置以前
提示,否则为容器大小的对数。
注记
暗示的插入%283,4%29不返回布尔值,以便与顺序容器上的位置插入兼容,例如std::vector::insert
这样就可以创建泛型插入器,例如std::inserter
.检查暗示插入的成功的一种方法是比较尺寸%28%29前后。
重载%285,6%29通常作为调用重载%283%29的循环来实现。end()
作为提示,它们被优化为附加排序序列%28,例如另一组%29,其最小元素大于*this
...
例
二次
#include <set>
#include <cassert>
#include <iostream>
int main()
{
std::set<int> set;
auto result_1 = set.insert(3
assert(result_1.first != set.end() // it's a valid iterator
assert(*result_1.first == 3
if (result_1.second)
std::cout << "insert done\n";
auto result_2 = set.insert(3
assert(result_2.first == result_1.first // same iterator
assert(*result_2.first == 3
if (!result_2.second)
std::cout << "no insertion\n";
}
二次
产出:
二次
insert done
no insertion
二次
另见
emplace (C++11) | constructs element in-place (public member function) |
---|---|
emplace_hint (C++11) | constructs elements in-place using a hint (public member function) |
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。