首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

真心【关于修改STL SET中元素】

2012-03-07 
真心求助【关于修改STL SET中元素】C/C++ code#include iostream#include vector#include set#include

真心求助【关于修改STL SET中元素】

C/C++ code
#include <iostream>#include <vector>#include <set>#include <string>using namespace std;int main(){    vector<int> ivec;    for(vector<int>::size_type i = 0; i != 10; ++i){        ivec.push_back(i);        ivec.push_back(i);    }    set<int> iset(ivec.begin(), ivec.end());    // set中键为const,在获得指向set中某元素的迭代器后,只能对其做读操作,而不能做写操作    set<int>::iterator set_it = iset.find(1);    *set_it = 11;//error    cout<<"*set_it="<<*set_it<<endl;}

VS2005,竟然通过了,可以修改set中元素,这是为什么,C++PRIMER中说上述代码是不肯能运行通过的

[解决办法]
set不是这样用的。set本质是二叉平衡查找树。也就是元素是排序的。
set<int>中的int,你删除之后,再insert一个是可以的。
你可以使用set<int*>,这样可以修改指针指向。
[解决办法]
标准C++运行库中的容器set是用二叉树实现的,这意味着set中的元素的值决定了它在树中的位置。和所有标准库容器一样,set通过iterator来访问其中的元素。iterator被设计为通过反引用操作来提供对所指元素的读/写访问的。换句话说,我们能通过容器的 iterator来修改其中的元素。
对一个set,修改其中的元素会破坏内部的树结构.因此,set的提供写访问权的iterator(所谓的mutable iterator)被认为是危险的。更有甚者,如果将iterator传给泛型算法,对某些泛型算法(包括remove()泛型算法),它们将悄悄地破坏掉set容器。

热点排行