程序员

标准模板库(STL)之 set 用法【初级】

2020-08-16  本文已影响0人  Aliven888

文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。


资料仅供学习交流使用。
作者:Aliven888

1、简述

定义:
set是一种二进制搜索树,是按照特定顺序存储唯一元素的一个集合。

特点:
1、在 set 中,每一个元素都是唯一的;
2、在 set 中,元素的值是不能被修改(元素始终为const)的,但可以将新的元素插入容器中 或 将旧的元素从容器中删除。

2、接口函数

下面是SDK官网的接口,以及其功能简述。

2.1、Iterators(迭代器):

名称 描述
begin Return iterator to beginning (public member function )
end Return iterator to end (public member function )
rbegin Return reverse iterator to reverse beginning (public member function )
rend Return reverse iterator to reverse end (public member function )
cbegin Return const_iterator to beginning (public member function )
cend Return const_iterator to end (public member function )
crbegin Return const_reverse_iterator to reverse beginning (public member function )
crend Return const_reverse_iterator to reverse end (public member function )

2.2、Capacity(容量):

名称 描述
empty Test whether container is empty (public member function )
size Return container size (public member function )
max_size Return maximum size (public member function )

2.3、Modifiers(修改):

名称 描述
insert Insert element (public member function )
erase Erase elements (public member function )
swap Swap content (public member function )
clear Clear content (public member function )
emplace Construct and insert element (public member function )
emplace_hint Construct and insert element with hint (public member function )

2.4、Operations(操作):

名称 描述
find Get iterator to element (public member function )
count Count elements with a specific value (public member function )
lower_bound Return iterator to lower bound (public member function )
upper_bound Return iterator to upper bound (public member function )
equal_range Get range of equal elements (public member function )

3、接口函数使用案例

接下来通过函数实例介绍下每个接口函数是如何使用,以及使用的过程中有哪些注意事项。
依赖的头文件:

   #include <set>

首先定义一个Vector对象,并附上初始值:

   std::set<int> m_setValue;
   
    m_setValue.insert(1);
    m_setValue.insert(2);
    m_setValue.insert(3);

3.1、Iterators(迭代器)

    
    //返回一个迭代器,指向容器的地址起始位置元素
    std::set<int>::iterator itBegin = m_setValue.begin();
    //std::set<int>::const_iterator itcBegin = m_setValue.cbegin();  //const 静态的

    //返回一个迭代器,指向容器中的past-the-end元素(最后一个元素的下一个位置)。
    std::set<int>::iterator itEnd = m_setValue.end();
    //std::set<int>::const_iterator itcEnd = m_setValue.cend();  //const 静态的

    //返回指向容器中最后一个元素的反向迭代器(即,它的反向开始)。
    std::set<int>::reverse_iterator itrBegin = m_setValue.rbegin();
    //std::set<int>::const_reverse_iterator itcrBegin = m_setValue.crbegin();  //const 静态的

    //返回一个反向迭代器,该反向迭代器指向set容器中第一个元素之前的理论元素(被视为其反向端)。
    std::set<int>::reverse_iterator itrEnd = m_setValue.rend();
    //std::set<int>::const_reverse_iterator itcrEnd = m_setValue.crend();   //const 静态的
    

3.2、Capacity(容量)

3.2.1 empty()

功能:
判断容器是否为空

返回值:
返回设置的容器是否为空(即其大小是否为0) 为空返回 true, 否则返回 false

代码演示:

    if (!m_setValue.empty())
    {
        qDebug("m_setValue is not empty.");
    }

3.2.2 size()

功能:
获取容器中当前元素的个数

返回值:
返回容器中的当前拥有的元素个数

代码演示:

    int iSize = m_setValue.size();
    qDebug("m_setValue size is = [%d]", iSize);

3.2.3 max_size()

功能:
获取容器最大所能容纳的元素个数。但是由于已知的系统或库实现限制,这是容器可以达到的最大潜在大小;绝不能保证容器能够达到该大小,有可能在达到该大小之前,它仍然存在无法分配存储的情况。

返回值:
返回设置的容器可以容纳的最大元素数。

代码演示:

    int iMax_size = m_setValue.max_size();
    qDebug("m_setValue max_size is = [%d]", iMax_size);

输出结果

STL set show...
m_setValue is not empty.
m_setValue size is = [3]
m_setValue max_size is = [214748364]

3.3、Operations(操作)

3.3.1 find(val)

功能:
在容器中搜索与val等效的元素

返回值:
如果找到了val元素,则返回一个指向val元素的迭代器;否则返回指向容器set :: end的迭代器。

代码演示:

    std::set<int>::iterator it = m_setValue.find(2);
    if (m_setValue.end() != it)
    {
        qDebug("m_setValue.find(2) value is = [%d]", *it);
    }

3.3.2 count(val)

功能:
在容器中搜索与val等效的元素的个数。

返回值:
因为set中的元素不能重复,如果容器包含等于val的元素,那么绝对是唯一的,所以找到的话会返回1,否则返回0。
该函数可以用于判断某个元素在set中是否存在,功能类似于find()函数

代码演示:

    if (0 == m_setValue.count(2))
    {
        qDebug("m_setValue Not Find Value 2");
    }

3.3.3 lower_bound(val)

功能:
官网给出的解释:
An iterator to the the first element in the container which is not considered to go before val, or set::end if all elements are considered to go before val. Member types iterator and const_iterator are bidirectional iterator types pointing to elements.

返回值:
但是通过我的演示发现,因为set会自动排序,所以lower_bound(val)返回的迭代器通常会指向val,哪怕 val 是最后一个元素值,其返回的迭代器依旧是指向 val, 而不是 std::set::end。

代码演示:

   //例如:当前 m_setValue[1,2,3]  此时 itLow3 指向 3 的迭代器,而不是 std::set::end.
   std::set<int>::iterator itLow3 = m_setValue.lower_bound(3);

3.3.4 upper_bound(val)

功能:
官网给出的解释:
An iterator to the the first element in the container which is considered to go after val, or set::end if no elements are considered to go after val. Member types iterator and const_iterator are bidirectional iterator types pointing to elements.

返回值:
但是通过我的演示发现,因为set会自动排序,所以upper_bound(val)返回的迭代器通常会指向val下一个位置, 如果 val 是最后一个元素值,其返回的迭代器指向 std::set::end。

代码演示:

    //例如:当前 m_setValue[1,2,3,4,5,6,7]  此时 itUp5 指向 6 的迭代器,而 itUp7 指向 std::set::end 
    std::set<int>::iterator itUp5 = m_setValue.upper_bound(5);
    std::set<int>::iterator itUp7 = m_setValue.upper_bound(7);

3.3.5 equal_range(val)

功能:
equal_range(val) 官方给出的解释是:返回set容器中两个相同的val的值范围

返回值:
但是因为set容器中不允许出现相同的val(每个val元素都是唯一的),所以该函数返回val指向的迭代器 和 val后面一个的迭代器,返回的两个迭代器和 lower_bound(val) & upper_bound(val)类似。

代码演示:

    std::pair<std::set<int>::const_iterator, std::set<int>::const_iterator> itEqual;
    itEqual = m_setValue.equal_range(4);

    qDebug("itEqual.first[%d] -- itEqual.second[%d]", *itEqual.first, *itEqual.second);

输出结果

m_setValue.find(2) value is = [2]
itEqual.first[4] -- itEqual.second[5]

3.4、Modifiers(修改)

3.4.1 insert (...)

功能:
向容器中添加元素,以实现扩充容器的效果

常用接口函数有:

(1) pair<iterator, bool> insert(const value_type& val); 添加静态val值
    pair<iterator, bool> insert(value_type&& val); //添加val值
(2) iterator insert(const_iterator position, const value_type& val); //在position位置添加静态val值
    iterator insert(const_iterator position, value_type&& val);  //在position位置添加val值
(3) template <class InputIterator>
    void insert(InputIterator first, InputIterator last);  //将另一个同类型的数值范围添加到set容器中

返回值:

返回值类型:std::pair<std::set<int>::iterator, bool> 
参数1:std::set<int>::iterator:迭代器指向新加入的元素
参数2:bool : 表示该元素是否存在过(如果之前不存在,返回true,如果之前已存在,返回false)

说 明:
我们在使用insert添加容器元素值得时候,大多数情况下是不考虑返回值的。

代码演示:

    // 例如:m_setValue.insert(7) : bool值为false
    //       m_setValue.insert(8) : bool值为true
    std::pair<std::set<int>::iterator, bool> itInsert7;
    std::pair<std::set<int>::iterator, bool> itInsert8;
    itInsert7 = m_setValue.insert(7);
    itInsert8 = m_setValue.insert(8);
    qDebug("itInsert7.first[%d] - [%d]", *itInsert7.first, itInsert7.second);
    qDebug("itInsert8.first[%d] - [%d]", *itInsert8.first, itInsert8.second);

    //除了insert(val)外,还有其他两种用法,这里不再细说。
    //iterator insert (iterator position, const value_type& val)
    //template <class InputIterator>
    //void insert(InputIterator first, InputIterator last);

3.4.2 erase(...)

功能:
表示取出(删除)某个元素或者某个范围内的元素。

常用接口函数有:

(1) void erase(iterator position);  清除迭代器指向的某个元素
(2) size_type erase(const value_type& val);  清除容器中的val元素
(3) void erase(iterator first, iterator last);  清除迭代器[first, last]范围内的元素

返回值:
该函数在使用时,很少去关注其返回值。在C++98版本中,是没有返回值的;而在C++11版本中,返回一个迭代器(指向删除元素的后面的一个)。

代码演示:

    m_setValue.erase(8);
    m_setValue.erase(itInsert7.first);
    std::set<int>::iterator it3 = m_setValue.find(3);
    std::set<int>::iterator it5 = m_setValue.find(5);
    m_setValue.erase(it3, it5);

3.4.3 swap(...)

功能:
用x的内容交换容器的内容,x是另一组相同类型的内容。 大小可能有所不同。

返回值:
void

代码演示:

    std::set<int> setChild;
    setChild.insert(100);
    setChild.insert(200);
    setChild.insert(300);
    m_setValue.swap(setChild);

3.4.4 clear()

功能:
清空容器中的所有元素

返回值:
void

代码演示:

    m_setValue.clear();

4、注意事项

1、上面的演示过程都是按照顺序进行的,元素的增减也是有序的。所以举例效果需要按照顺序查看。

上一篇下一篇

猜你喜欢

热点阅读