C++容器(Set)

2

C++容器(Set)

  容器是C++非常方便的功能,今天给小伙伴们介绍set库,set库是C++中的哈希表,也可以称其为集合,其特点是每个元素只出现一次,可以查找某个元素是否在集合中出现,在判重或者记忆化等题目中有很好的使用场景,是小伙伴们必须掌握的一种数据结构。

set容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include<iostream>
#include<set>
using namespace std;

// 为了方便显示,在这里将打印操作定义为一个函数
// 注意,set集合中插入元素时会自动进行排序,因此传入其他类型时,要加载比较函数。
void printSet(set<int> s) {
cout << "s:";
for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}

int main() {

// 创建一个set容器,同vector相同,可以存放任意类型的数据,但是需要指定数据类型。
// 而且建立以后只能存放该类型的数据。
set<int> s = { 6, 2, 4 };
printSet(s);

// empty判断容器是否为空,为空则返回true,否则返回false
cout << "s是否为空:" << s.empty() << endl;
// set对象没有capacity方法,只有size方法,和vector相同,可以获取容器中的元素个数。
cout << "s的尺寸为:" << s.size() << endl;

// insert是set中最最重要的一个方法,用于向容器中添加元素。
// 虽然其他容器也有insert方法,但是我并没有介绍,因为要传入一个迭代器对象,而且操作并不是很方便。
// 但是set集合的insert非常方便,也是唯一一个能够增加元素的方法。
s.insert(3);
s.insert(1);
s.insert(5);
s.insert(1);
printSet(s);
cout << "s是否为空:" << s.empty() << endl;
cout << "s的尺寸为:" << s.size() << endl;

// erase方法和insert相反,将set集合中的元素移除。
// 在其他容器中也有erase方法,但是也要传入迭代器对象,因此也没有过多介绍。
s.erase(2);
printSet(s);
cout << "s是否为空:" << s.empty() << endl;
cout << "s的尺寸为:" << s.size() << endl;

//find方法查找set集合中某个元素所在的位置,并且返回迭代器对象,在这里不进行演示,对于multiset则是第一次出现该元素所在的位置。

// count方法也是set集合非常重要的方法,一般使用set集合,就是为了判断某个元素是否存在于集合之中。
// count值为0说明元素不在其中,count元素为1说明在集合中。
// 为什么不返回布尔类型呢,小伙伴们可以参考multiset数据类型,是一种可插入重复元素的集合。
cout << "1的个数为:" << s.count(1) << endl;
cout << "2的个数为:" << s.count(2) << endl;

// clear清空容器中的所有内容
s.clear();
cout << "s是否为空:" << s.empty() << endl;
cout << "s的尺寸为:" << s.size() << endl;

return 0;
}

1

unordered_set容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<iostream>
#include<unordered_set>
using namespace std;

// 为了方便显示,在这里将打印操作定义为一个函数
// 注意,unordered_set集合中插入元素时不会自动进行排序,其顺序为创建时和插入的顺序。因此可以传入任意类型。
void printUnorderedSet(unordered_set<int> s) {
cout << "s:";
for (unordered_set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}

int main() {

// 创建一个unordered_set容器,创建方法与set相同
// 而且建立以后只能存放该类型的数据。
unordered_set<int> s = { 6, 2, 4 };
printUnorderedSet(s);

// 其他方法和set容器几乎完全相同,可以参考上面的内容,在这也不做过多赘述。
cout << "s是否为空:" << s.empty() << endl;
cout << "s的尺寸为:" << s.size() << endl;

s.insert(3);
s.insert(1);
s.insert(5);
s.insert(1);
printSet(s);
cout << "s是否为空:" << s.empty() << endl;
cout << "s的尺寸为:" << s.size() << endl;

s.erase(2);
printSet(s);
cout << "s是否为空:" << s.empty() << endl;
cout << "s的尺寸为:" << s.size() << endl;

cout << "1的个数为:" << s.count(1) << endl;
cout << "2的个数为:" << s.count(2) << endl;

s.clear();
cout << "s是否为空:" << s.empty() << endl;
cout << "s的尺寸为:" << s.size() << endl;

return 0;
}

1

C++小结

  哈希表没有front和back方法,也无法通过索引进行遍历。使用哈希表时,只要记住4个重要的函数即可,insert,erase,count,size。常常在BFS或者DFS或者数组中出现,如搜索时,该点已经搜索完成,则可以将其加入哈希表,下次查到该点时则可以不再进行查找,节约大量的时间,因此小伙伴们一定要掌握它。

-------------本文结束感谢您的阅读-------------
0%