1.set的介绍

set的介绍

在这里插入图片描述
              

  (1)set是按照一定次序存储元素的容器。

  (2)在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。

  (3)在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。

  (4)set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。

  (5)set在底层是用二叉搜索树实现的。

              

2.set的使用

在这里插入图片描述

  set提供的模版参数列表:

  T: set中存放元素的类型,实际在底层存储<value, value>的键值对。

  Compare:set中元素默认按照小于来比较。

  Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理

              

2.1set的构造函数

在这里插入图片描述


  set提供了三种构造函数:

函数声明功能介绍
set (const Compare& comp = Compare(), const Allocator& = Allocator() );构造空的set
set (InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& = Allocator(());用[first, last)区间中的元素构造set
set ( const set<Key,Compare,Allocator>& x);set的拷贝构造

  以下是一些set构造函数的简单示例:

//1.默认构造函数:
std::set<int> mySet; // 创建一个空的set,元素类型为int

//2.使用迭代器构造:
std::vector<int> vec = {1, 2, 3, 4, 5};
std::set<int> mySet(vec.begin(), vec.end()); // 使用vector的迭代器构造set

//3.拷贝构造函数:
std::set<int> mySet1 = {1, 2, 3};
std::set<int> mySet2(mySet1); // 使用另一个set进行拷贝构造

              

2.2set的迭代器

在这里插入图片描述

在这里插入图片描述


  set同样提供了很多的迭代器:

函数声明功能介绍
iterator begin()返回set中起始位置元素的迭代器
iterator end()返回set中最后一个元素后面的迭代器
const_iterator cbegin() const返回set中起始位置元素的const迭代器
const_iterator cend() const返回set中最后一个元素后面的const迭代器
reverse_iterator rbegin()返回set第一个元素的反向迭代器,即end
reverse_iterator rend()返回set最后一个元素下一个位置的反向迭代器,即rbegin
const_reverse_iterator crbegin() const返回set第一个元素的反向const迭代器,即cend
const_reverse_iterator crend() const返回set最后一个元素下一个位置的反向const迭代器,即crbegin

  下面是一个使用这些迭代器的示例:

#include <iostream>
#include <set>

int main() {
    std::set<int> mySet = {1, 2, 3, 4, 5};

    // 使用正向迭代器遍历set
    std::cout << "正向遍历: ";
    for (auto it = mySet.begin(); it != mySet.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 使用反向迭代器遍历set
    std::cout << "反向遍历: ";
    for (auto it = mySet.rbegin(); it != mySet.rend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 使用const迭代器遍历set
    std::cout << "const遍历: ";
    for (auto it = mySet.cbegin(); it != mySet.cend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 使用const反向迭代器遍历set
    std::cout << "const反向遍历: ";
    for (auto it = mySet.crbegin(); it != mySet.crend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

//正向遍历: 1 2 3 4 5 
//反向遍历: 5 4 3 2 1 
//const遍历: 1 2 3 4 5 
//const反向遍历: 5 4 3 2 1 

              

2.3set的容量函数

在这里插入图片描述
在这里插入图片描述

  set常用的容量函数:

函数声明功能介绍
bool empty ( ) const检测set是否为空,空返回true,否则返回true
size_type size() const返回set中有效元素的个数
#include <iostream>
#include <set>

int main() {
    std::set<int> mySet;

    if (mySet.empty()) {
        std::cout << "set为空" << std::endl;
    } else {
        std::cout << "set不为空" << std::endl;
    }

    mySet.insert(1);
    mySet.insert(2);
    mySet.insert(3);

    if (mySet.empty()) {
        std::cout << "set为空" << std::endl;
    } else {
        std::cout << "set不为空" << std::endl;
    }

    std::cout << "set中元素的个数为: " << mySet.size() << std::endl;
    
    return 0;
}

//set为空
//set不为空
//set中元素的个数为: 3

              

2.4set的增删查改函数

在这里插入图片描述
在这里插入图片描述

函数声明功能介绍
pair<iterator,bool> insert ( const value_type& x )在set中插入元素x,实际插入的是<x, x>构成的键值对,如果插入成功,返回<该元素在set中的位置,true>,如果插入失败,说明x在set中已经存在,返回<x在set中的位置,false>
void erase ( iterator position )删除set中position位置上的元素
size_type erase ( const key_type& x )删除set中值为x的元素,返回删除的元素的个数
void erase ( iterator first, iterator last )删除set中[first, last)区间中的元素
void swap ( set<Key,Compare,Allocator>& st );交换set中的元素
void clear ( )将set中的元素清空
iterator find ( const key_type& x ) const返回set中值为x的元素的位置
size_type count ( const key_type& x ) const返回set中值为x的元素的个数

  set中的insert()函数用于向set中插入元素,它有多种重载形式。示例如下:

#include <iostream>
#include <set>

int main() {
    std::set<int> mySet;

    // 插入单个元素
    mySet.insert(1);

    // 插入多个元素
    mySet.insert({2, 3, 4});

    // 插入范围内的元素
    std::set<int> anotherSet = {5, 6, 7};
    mySet.insert(anotherSet.begin(), anotherSet.end());

    // 输出set中的元素
    for (auto it = mySet.begin(); it != mySet.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

//1 2 3 4 5 6 7


  set中的erase()函数用于删除set中的元素,它也有多种重载形式。示例如下:

#include <iostream>
#include <set>

int main() {
    std::set<int> mySet = {1, 2, 3, 4, 5};

    // 删除指定元素
    mySet.erase(3);

    // 删除指定范围内的元素
    mySet.erase(mySet.begin(), mySet.find(4));

    // 输出set中的元素
    for (auto it = mySet.begin(); it != mySet.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

//4 5

              

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐