• 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;
    }
    
  • 相关阅读:
    Hibernate 小章总结(三)
    河北民间组织管理系统软件
    《编写有效用例阅读笔记二》
    《编写有效用例》读后感(一)
    专业实训需求分析
    2015秋季个人阅读计划
    大道至简阅读笔记之三
    大道至简阅读笔记之二
    大道至简阅读笔记之一
    程序员修炼之道阅读笔记之二
  • 原文地址:https://www.cnblogs.com/mmmmmmmmm/p/14743981.html
Copyright © 2020-2023  润新知