真心【关于修改STL SET中元素】
真心求助【关于修改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容器。