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;
    }
  • 相关阅读:
    机器学习作业(八)异常检测与推荐系统——Matlab实现
    机器学习笔记(九)异常检测与推荐系统
    Coursera 吴恩达 机器学习 学习笔记
    机器学习作业(七)非监督学习——Matlab实现
    机器学习笔记(八)非监督学习

    希尔排序
    霍纳算法的散列函数
    javascript判断给定字符串是否是回文
    JavaScript链表
  • 原文地址:https://www.cnblogs.com/xiaouisme/p/2721652.html
Copyright © 2011-2022 走看看