首页 > 编程笔记 > C++笔记 阅读:29

C++ set容器用法详解(附带实例)

set 容器是一个内容自动有序且不含重复元素的容器。使用 set 容器存储的键值对,要求键(key)和值(value)必须相等。

例如,有下面两组键值对数据,第一组中各键值对的键和值不相等,第二组中各键值对的键和值相等:
set 容器只能存储第二组键值对,无法存储第一组键值对。

基于 set 容器的这种特性,使用 set 容器存储键值对时,只需要为其提供各键值对中的 value 值即可。以存储上面第 2 组键值对为例,只需要为 set 容器提供 {'a','b','c'},该容器即可成功将它们存储起来。

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 容器的主要成员函数如下表所示:

表: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

相关文章