zoukankan      html  css  js  c++  java
  • std::set的迭代器不能修改对应的元素

    c++不长搞,每次搞都频繁掉进陷阱里。。。

    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;
    }
  • 相关阅读:
    由u盘安装Ubuntu引出的事件
    初试Ubuntu
    从error 中学习
    快手一面:牛客:字符串左移
    快手一面:Leetcode:最小栈
    十三、线程池
    十二、windows临界区、其他各种mutex互斥量
    十一、std::async深入
    LeetCode(703):找出数据流中的第K大元素
    LeetCode(1003):检查替换后的字符串
  • 原文地址:https://www.cnblogs.com/xiaouisme/p/2721652.html
Copyright © 2011-2022 走看看