std::
unordered_set::insert
公众成员函数 <unordered_set>
(1) |
pair<iterator,bool> insert (const value_type& val); |
(2) |
pair<iterator,bool> insert ( value_type&& val ); |
(3) |
iterator insert ( const_iterator hint, const value_type& val ); |
(4) |
iterator insert (const_iterator hint, value_type&& val); |
(5) |
template <class InputIterator>
void insert ( InputIterator first, InputIterator last ); |
(6) |
void insert ( initializer_list<value_type> il ); |
插入元素
在
unordered_set中插入新元素。
每个元素只有在与容器中其他元素不相等时才会被插入(unordered_set中元素的值是唯一的)。
形参决定插入多少个元素以及初始化它们的值:
☲ 参数
-
val
-
要复制(或移动)到插入元素中的值。
版本(1)和(3)复制元素(val继续保存其内容,容器保存其副本)。
版本(2)和(4)移动元素(也就是说,val失去了它的内容,由容器中的新元素获取)。
成员类型value_type是容器中元素的类型,在unordered_set中定义为它的第一个模板形参(Key)的别名。
-
hint
-
迭代器指向一个建议的位置,提示从哪里开始搜索合适的插入点。
容器可能会使用这个值来优化操作,也可能不会。不管传递了什么提示,元素都将存储在相应的bucket中.
成员类型const_iterator是前向迭代器类型。
-
first, last
-
指定元素范围的迭代器。将[first,last)范围内元素的副本插入容器中。
使用的范围是[first,last),它包括first和last之间的所有元素,
包括first指向的元素,但不包括last指向的元素。
first和last都不应该是目标容器中的迭代器。
模板类型可以是任何类型的输入迭代器。
-
il
-
一个initializer_list对象。编译器将自动从初始化器列表声明器构造此类对象。
成员类型value_type是容器中元素的类型,在 unordered_set中定义为其第一个模板形参(Key)的别名。
☉ 返回值
在版本(1)和(2)中,函数返回一个
pair对象,其第一个元素是指向容器中新插入的元素或键值相等的元素的迭代器,
并返回bool值,指示该元素是否成功插入。
在版本(3)和(4)中,函数返回一个迭代器,指向容器中新插入的元素或键值相等的元素。
版本(5)和(6)没有返回值。
成员类型
iterator是前向迭代器类型.
unordered_set容器中的所有迭代器都具有对元素的
const访问权限:元素可以插入或移除,但不能在容器中修改。
使用
allocator_traits<allocator_type>::construct()分配新元素的存储,
失败时可能抛出异常(对于默认分配器,如果分配请求不成功则抛出
bad_alloc)。
☣ 示例
// unordered_set::insert
#include <iostream>
#include <string>
#include <array>
#include <unordered_set>
int main ()
{
std::unordered_set<std::string> myset = {"yellow","green","blue"};
std::array<std::string,2> myarray = {"black","white"};
std::string mystring = "red";
myset.insert (mystring); // copy insertion
myset.insert (mystring+"dish"); // move insertion
myset.insert (myarray.begin(), myarray.end()); // range insertion
myset.insert ( {"purple","orange"} ); // initializer list insertion
std::cout << "myset contains:";
for (const std::string& x: myset) std::cout << " " << x;
std::cout << std::endl;
return 0;
} |
输出:
myset contains: green blue reddish white yellow black red orange purple
✥ 复杂度
-
单元素插入:
-
平均情况下:常数。
最坏情况:容器大小呈线性。
-
多个元素插入:
-
平均情况:插入元素的数量呈线性。
最坏情况:N*(size+1):插入的元素数量乘以容器大小再加1。
可能会触发重新hash(不包括)。
☣ 迭代器的有效性
在大多数情况下,容器中的所有迭代器在插入之后仍然有效。
唯一的例外是容器的增长迫使rehash。在这种情况下,容器中的所有迭代器都失效。
如果插入操作后的新容器大小超过其容量阈值(计算方法为容器的bucket_count乘以其max_load_factor),则强制进行rehash。
对unordered_set容器中的元素的引用在所有情况下仍然有效,即使在rehash之后也是如此。
🍄 另请参阅
unordered_set::erase |
删除元素(公众成员函数) |
unordered_set::emplace |
构造和插入元素(公众成员函数) |
unordered_set::emplace_hint |
构造和插入元素并加提示(公众成员函数) |
unordered_set::operator= |
复制容器内容(公众成员函数) |