C++ set容器用法详解(附带实例)
set 容器是一个内容自动有序且不含重复元素的容器。使用 set 容器存储的键值对,要求键(key)和值(value)必须相等。
例如,有下面两组键值对数据,第一组中各键值对的键和值不相等,第二组中各键值对的键和值相等:
set 容器只能存储第二组键值对,无法存储第一组键值对。
基于 set 容器的这种特性,使用 set 容器存储键值对时,只需要为其提供各键值对中的 value 值即可。以存储上面第 2 组键值对为例,只需要为 set 容器提供 {'a','b','c'},该容器即可成功将它们存储起来。
set 容器的特点如下:
set 容器定义于 <set> 头文件,并位于 std 命名空间中。因此如果想在程序中使用set容器,该程序代码应先包含如下语句:
1) 创建空的 set 对象,语法格式如下:
2) 创建 set 对象的同时进行初始化,语法格式如下:
3) 使用复制构造函数,通过已有的 set 对象创建新的 set 对象,语法格式如下:
4) 复制 set 对象的部分元素,创建新的 set 对象,语法格式如下:
5) 创建 set 对象时修改排序规则。例如:
【实例 1】用 set 创建一个整型集合,然后向集合中插入元素,最后调用 erase() 函数删除数据,输出删除前、后的结果。具体代码如下:
【实例 2】创建一个字符型 set 对象,插入元素值,并通过指定字符在集合中查找元素。代码如下:
例如,有下面两组键值对数据,第一组中各键值对的键和值不相等,第二组中各键值对的键和值相等:
- 第一组键值对:{<'s1', 1>, <'s2', 2>, <'s3', 3>}
- 第二组键值对:{<'a', 'a'>, <'b', 'b'>, <'c', 'c'>}
set 容器只能存储第二组键值对,无法存储第一组键值对。
基于 set 容器的这种特性,使用 set 容器存储键值对时,只需要为其提供各键值对中的 value 值即可。以存储上面第 2 组键值对为例,只需要为 set 容器提供 {'a','b','c'},该容器即可成功将它们存储起来。
set 容器的特点如下:
- 存储的键和值相等的键值对,并且真正存储的是各个键值对的值;
- 存储数据时,自动根据元素值的大小进行排序,默认为升序排序;
- 存储到 set 容器中的元素,元素值无法修改;
- 存储的元素必须互不相等。
set 容器定义于 <set> 头文件,并位于 std 命名空间中。因此如果想在程序中使用set容器,该程序代码应先包含如下语句:
#include<set> using namespace std;如果不声明 std 命名空间,在程序中使用 set 容器时,需手动注明 std 命名空间,如“std::set”。
C++创建set对象
创建 set 对象的方法有以下 5 种:1) 创建空的 set 对象,语法格式如下:
std::set<type> name;例如,创建一个可容纳 int 型元素的空对象 intset,代码如下:
std::set<int> intset;
2) 创建 set 对象的同时进行初始化,语法格式如下:
std::set<type> name{ "type1","type2","type3"…};例如,创建一个包含 3 个 string 元素的 myset 对象,代码如下:
std::set<string> myset{"Tom","Marry","Jerry"};因为默认采用 less<T> 升序排序,所以 myset 对象中 string 元素的顺序为:"Jerry", "Marry", "Tom"。
3) 使用复制构造函数,通过已有的 set 对象创建新的 set 对象,语法格式如下:
std::set<type> name(oldset);例如,在前面创建的 myset 对象的基础上创建 copyset 对象,代码如下:
std::set<string> copyset(myset);
4) 复制 set 对象的部分元素,创建新的 set 对象,语法格式如下:
std::set<type> name(first,last);例如,在前面创建的 myset 对象的基础上,创建 copyset 对象,代码如下:
std::set<string> copyset(++myset.begin(), myset.end());部分初始化的 copyset 对象中仅有两个 string 字符串:"Jerry", "Marry"。
5) 创建 set 对象时修改排序规则。例如:
std::set<string,greater<string> > myset{"Tom","Marry","Jerry"};其中,greater<string> 表示降序排序。排序后,元素的存储顺序为"Tom","Marry","Jerry"。
C++创建set容器成员函数
set 容器的主要成员函数如下表所示:函数 | 说明 |
---|---|
size() | 返回集合的大小 |
max_size() | 返回 STL 允许的最大容量,通常是一个很大的数 |
begin() | 返回指向集合中第一个元素的迭代器 |
end() | 返回指向集合中最后一个元素的迭代器 |
rbegin() | 返回一个反向迭代器,指向集合中最后一个元素 |
rend() | 返回一个反向迭代器,指向集合中第一个元素 |
empty() | 判断集合是否为空。如果为空,返回 true 值 |
clear() | 删除集合中所有元素 |
count(x) | 返回集合中值为 x(0 或 1)的元素个数 |
erase(x) | 删除集合中值为 x 的元素 |
erase(i) | 删除迭代器 i 指向的集合元素 |
erase(start, end) | 删除迭代器 start 和 end 所辖范围内的集合元素 |
find(x) | 在集合中查找目标元素。如果 x 不存在,返回的迭代器等于 end |
insert(i, x) | 把值 x 插入集合。x 的插入位置从迭代器 i 指向的元素处开始查找 |
insert(x) | 把 x 插入集合 |
insert(start, end) | 把迭代器 start 和 end 所辖范围内的值插入集合 |
lower_bound(x) | 查找集合中大于等于目标值的第一个元素 |
upper_bound(x) | 查找集合中大于目标值的第一个元素 |
equal_range(x) | 查找集合中等于目标值的元素范围,返回两个迭代器,分别指向第一个值等于 x 的元素和第一个值大于 x 的元素 |
swap(set) | 交换两个集合的内容 |
value_comp() | 返回 value_compare 类型的对象,该对象用于判断集合中元素的先后次序 |
【实例 1】用 set 创建一个整型集合,然后向集合中插入元素,最后调用 erase() 函数删除数据,输出删除前、后的结果。具体代码如下:
#include <iostream> #include <set> using namespace std; int main() { set<int> iSet; // 创建一个整型集合 iSet // 依次向集合中插入 5 个元素 iSet.insert(1); iSet.insert(3); iSet.insert(5); iSet.insert(7); iSet.insert(9); cout << "old set:" << endl; set<int>::iterator it; for (it = iSet.begin(); it != iSet.end(); ++it) // 输出集合中的元素 cout << *it << endl; it = iSet.begin(); iSet.erase(++it); // 删除集合的第 2 个元素(即 3) cout << "new set:" << endl; for (it = iSet.begin(); it != iSet.end(); ++it) // 输出集合中的元素 cout << *it << endl; return 0; }程序运行结果为:
old set: 1 3 5 7 9 new set: 1 5 7 9
【实例 2】创建一个字符型 set 对象,插入元素值,并通过指定字符在集合中查找元素。代码如下:
#include <iostream> #include <set> using namespace std; int main() { set<char> cSet; // 创建字符类型的集合 // 插入元素 cSet.insert('B'); cSet.insert('C'); cSet.insert('D'); cSet.insert('A'); cSet.insert('F'); cout << "old set:" << endl; set<char>::iterator it; // 循环显示集合中的元素 for (it = cSet.begin(); it != cSet.end(); ++it) cout << *it << endl; char cTmp; /* 第一次查找 */ cTmp = 'D'; it = cSet.find(cTmp); // 在集合中查找指定的元素 cout << "start find: " << cTmp << endl; if (it == cSet.end()) // 没找到元素 cout << "not found" << endl; else // 找到元素 cout << "found" << endl; /* 第二次查找 */ cTmp = 'G'; it = cSet.find(cTmp); // 查找指定的元素 cout << "start find: " << cTmp << endl; if (it == cSet.end()) // 没找到元素 cout << "not found" << endl; else // 找到元素 cout << "found" << endl; return 0; }程序运行结果为:
old set: A B C D F start find: D found start find: G not found