C++ STL的unordered_set insert()函数
概述
C++ STL的 unordered_set
是一个哈希表,它通过哈希函数将元素插入到容器中,使得查找、插入等操作都可以在常数时间内完成。在 unordered_set
中插入元素可以使用 insert()
函数。下面我们将具体介绍 unordered_set
中的 insert()
函数的使用方法。
使用方法
基本使用
unordered_set
中的 insert()
函数有如下两种使用方法:
bool insert(const value_type& value);
template<typename P> bool insert(P&& value);
其中第一个函数的参数类型为 const value_type&
,表示将 value_type
类型的值 value
插入到 unordered_set
中。例如:
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
for (const auto& k : s) {
std::cout << k << ' ';
}
return 0;
}
输出结果为:
1 2 3
第二个函数的参数类型为 P&&
,这里的 P
可以是一个类型或者一个 std::pair
类型,表示将 P
类型的值插入到 unordered_set
中。例如:
#include <iostream>
#include <unordered_set>
struct Foo {
int x;
int y;
Foo(int a, int b) : x(a), y(b) {}
bool operator==(const Foo& f) const {
return x == f.x && y == f.y;
}
};
int main() {
std::unordered_set<Foo> s;
s.insert(std::make_pair(1, 2));
s.insert(Foo(2, 3));
for (const auto& k : s) {
std::cout << '(' << k.x << ',' << k.y << ')' << ' ';
}
return 0;
}
输出结果为:
(1,2) (2,3)
使用 insert() 函数插入多个元素
标准库还提供了另一种插入多个元素的方法,即使用 insert()
函数的迭代器版本。这个版本的 insert()
函数可以接收两个迭代器作为参数,将两个迭代器范围内的元素插入到 unordered_set
容器中。例如:
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s;
std::vector<int> v = {1, 2, 3, 2, 1};
s.insert(v.begin(), v.end());
for (const auto& k : s) {
std::cout << k << ' ';
}
return 0;
}
输出结果为:
3 2 1
insert() 函数返回值
当 insert()
函数将元素成功插入到 unordered_set
中时,返回值为 true
。当 unordered_set
中已经有与待插入元素 value
或 P
关键字相同的元素时,新元素不会被插入,并且返回值为 false
。例如:
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> s = {1, 2, 3};
bool b1 = s.insert(1);
bool b2 = s.insert(4);
std::cout << b1 << '\n'; // false
std::cout << b2 << '\n'; // true
for (const auto& k : s) {
std::cout << k << ' ';
}
return 0;
}
输出结果为:
0
1
1 2 3 4
总结
unordered_set
提供了高效的哈希查找和插入操作, insert()
函数可以方便地将元素插入到 unordered_set
中。在使用 insert()
函数时要注意返回值,根据返回值的布尔值判断元素是否插入成功。此外,也可以使用迭代器版本的 insert()
函数一次性插入多个元素。不过,要注意不能将已经存在于 unordered_set
中的关键字再次插入,否则会导致插入失败并返回 false
。