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
ICP备案:
公安联网备案: