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;
    }
  • 相关阅读:
    CentOS 6 + bochs-2.6 + gdb 调试 linux 0.11 —— 成功
    操作系统原理——互斥同步
    CentOS 6 bochs-2.6 gdb 调试 linux 0.11——bochsrc-fd1-gdb.bxrc
    vim+xxd=强大的十六进制编辑器
    【t043】成绩查询
    【u251】心灵的抚慰
    【t041】距离之和
    【t086】防护伞
    Java Web整合开发(37) -- SVN
    ubuntu命令
  • 原文地址:https://www.cnblogs.com/xiaouisme/p/2721652.html
Copyright © 2011-2022 走看看