在线文档教程
C++
容器 | Containers

std::set::insert

STD::set::插入

std::pair insert( const value_type& value (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是空的,insertedfalse,,,positionend(),和node是空的。否则如果插入发生,insertedtrue,,,position指向插入的元素,以及node是空的。如果插入失败,insertedfalse,,,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。

http://en.cppreference.com/w/cpp/container/set/INSERT