c++ set容器

638 阅读2分钟

这是我参与更文挑战的第10天,活动详情查看: 更文挑战

set容器

1. set基本概念

和 map、multimap 容器不同,使用 set 容器存储的各个键值对,要求键 key 和值 value 必须相等,底层是一个二叉树

当用set容器进行存储键值对时,只需要提供一组数据即可,例如{'a','b','c'}

与map类似,set中也会自行根据键的大小来对存储的键值进行排序。由于键key与value相同,根据key排序,和根据value排序没区别。

同时,与map中不允许有相同的key值类似,set中元素值不能相同。

对于初学者来说,切勿尝试直接修改 set 容器中已存储元素的值,这很有可能破坏 set 容器中元素的有序性,最正确的修改 set 容器中元素值的做法是:先删除该元素,然后再添加一个修改后的元素。

2. set基本构造方法

#include <iostream>
#include <set>
#include <string>
using namespace std;

void printSet(set<string>&s)
{
    for(set<string>::iterator it = s.begin();it != s.end(); it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}

void test01()
{
    //构造一个string类型set容器
    set<string> myset;
    //向容器中插入元素
    myset.insert("allen");
    myset.insert("Bob");
    myset.insert("Keylle");
    
    //无论怎样的插入顺序,结果都会安装AscII顺序输出
    printSet(myset);
    
    //删除容器中值为Bob的元素
    myset.erase("Bob");

    printSet(myset);

    //用一个set容器初始化另一个set容器
    set<string> copySet(myset);
    printSet(copySet);

}

int main(){
    test01();
    return 0;
    
}

输出结果:

Bob Keylle allen 
Keylle allen 
Keylle allen 

3.set容器的基本用法

(1)begin()      

返回set容器的第一个元素,使用的时候加指针, 如*myset.begin();

(2) end()

返回set容器的最后一个元素,使用的时候加指针,如 *myset.end();

还要注意begin() 和 end()函数是不检查set是否为空的,使用前最好使用empty()检验一下set是否为空.

(3) clear()

删除set容器中的所有的元素。

(4) empty()

判断set容器是否为空。

(5) max_size()

返回set容器可能包含的元素最大数目。

(6)size()

返回当前set容器中的元素个数。

(7)rbegin()

返回的值和end()相同。

(8) rend()

返回的值和begin()相同.

(9) count()

本来用来查找set中某个某个键值出现的次数。这个在set中并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。