• 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;
    }
  • 相关阅读:
    摘金奇缘在线观看迅雷下载
    无敌破坏王2:大闹互联网在线观看
    神奇动物:格林德沃之罪电影在线观看
    你好,之华
    毒液:致命守护者
    apache 通过ajp访问tomcat多个站点
    docker使用大全 tomcat安装
    Log4j2 + Maven的配置文件示例详解
    centos7 设置tomcat自启动
    nginx多站路由配置tomcat
  • 原文地址:https://www.cnblogs.com/xiaouisme/p/2721652.html
Copyright © 2020-2023  润新知