std::set、multiset和unordered_set(hash_set)

中文标准库:multiset

一、构造

二、set在标准库中的算法

标准库algorithm

  • std::set_union 计算两个集合的并集

  • set_symmetric_difference 计算两个集合的对称差

  • std::set_intersection 计算两个集合的交集

  • std::set_difference 计算两个集合的差集 转载:set_difference的使用

三、修改元素

删除再重新插入

利用智能指针修改set元素

转载:set迭代器修改元素

std::set<int> iset;
std::set<int>::iterator it = iset.insert(4).first;
(*it)++; // error. 原因:std::set的迭代器不能修改对应的元素.

这是因为std::set的特点是:

  1. 对于插入、删除和查找操作,set保证其时间复杂度都是O(log n);

  2. set是一个有序的、可以前向和后向遍历的容器(双向迭代器);

  3. set是一个元素类型和比较函数可以配置的容器,但是一经配置,就不可更改;

  4. set的元素可以插入、删除,但是不可更改。

set在任何时刻都是一个有序的结构,而一旦破坏这个有序性,set可能表现出非预期的行为。为了保证set的概念完整性,C++STL厉行规定了3和4两个限制,在绝大部分情况下,这两个限制是合理的。

但是,当我在set里面存的是shared_ptr元素时, 根本无所谓有没有序. 我就是要通过迭代器获取元素的非const引用. 解决如下:

点击查看代码
#include <iostream>
#include <set>
template<class T>
inline T & GetStdSetElement(std::_Rb_tree_const_iterator<T>  std_set_iterator)
{
    return *(T *)&(*std_set_iterator);
}

int main()
{    
    using namespace std;

    set<int> iset;
    pair< set<int>::iterator, bool> res = iset.insert(4);

    int & i = GetStdSetElement(res.first);
    i++;

    cout << *( iset.begin() ) << endl;

    return 0;
}

四、添加元素

从vector添加元素

insert(vec.begin(),vec.end());

五、set元素设置为自定义数据结构

必须在类外重载小于(<)运算符

点击查看代码
#include<iostream>
#include<set>

struct Set
{
    Set(int _x, int _y)
    {
        x = _x;
        y = _y;
    }
    int x;
    int y;
};

bool operator<(Set a, Set b)//对<运算符 重载 
{
    return a.x > b.x;
}
int main()
{

    Set s1(2, 3);
    Set s2(3, 4);
    Set s3(4, 5);
    Set s4(2, 3);
    std::set<Set> x{ s1,s2,s3,s4 };

    int tet = 0;
    return 0;
}

六、访问set元素

set元素的访问必须使用迭代器,关于迭代器的使用
如果要访问第n个元素可以这样做:

auto it = set.begin();
std::advance(it, n); // n即为元素下标
auto ret = *it;

七、其他

#include <iostream>
#include <unordered_set>
#include <concurrent_unordered_set.h>

using namespace std;

int main()
{
    unordered_set<int> myset{ 1,2,3,4,5,6,7 };

    for (auto x : { 2,4,8 })
    {
        if (myset.contains(x))
            cout << "found\t" << x;

    }

    return 0;
}

原文链接: https://www.cnblogs.com/mmmmmmmmm/p/14743981.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    std::set、multiset和unordered_set(hash_set)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/404146

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月24日 下午6:43
下一篇 2023年4月24日 下午6:43

相关推荐