DrC*_*sos 4 c++ iterator stl const
我正在学习C++,无法理解这个问题:
我有一个简单的A类
class A {
private:
int ival;
float fval;
public:
A(int i = 0, float f = 0.0) : ival(i), fval(f) { }
~A(){ }
void show() const {
cout << ival << " : " << fval << "\n";
}
void setVal(int i) {
ival = i;
}
//const getters for both ival and fval
//used for the default "lesser"
friend bool operator<(const A& val1, const A& val2) {
return val1.ival < val2.ival ? true : false;;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个常规的循环set<A> myset填充insert(A(2, 2.2));.
迭代获取所有值不是问题,但我想修改此迭代中的值:
for(set<A>::iterator iter = set3.begin(); iter != set3.end(); iter++) {
iter->setVal(1);
}
Run Code Online (Sandbox Code Playgroud)
我认为这应该是可行的,就像你在foreach循环中用Java做的那样.编译时,我得到error: passing ‘const A’ as ‘this’ argument of ‘void A::setVal(int)’ discards qualifiers.
看看STL集的来源,我看到它begin()只能作为const方法使用,我认为这可能是问题所在.在setVal()方法上乱用const 得到总是相同的错误,因为我想修改它的值,所以没有多大意义A.
这是A用循环改变一堆值的错误方法吗?
STL集不允许您更改它存储的值.它通过迭代器(而不是集合中的实际对象)返回对象的副本来实现.
set这样做的原因是因为它使用<来对集合进行排序,并且它不想在每次取消引用迭代器时重新创建整个树,因为它不知道你是否改变了任何东西这会改变顺序.
如果需要更新集合<>,请删除旧值并添加新值.
编辑:刚刚检查了SGI STL的来源,它说:
typedef typename _Rep_type::const_iterator iterator;
Run Code Online (Sandbox Code Playgroud)
所以,set :: iterator只是一个set :: const_iterator
| 归档时间: |
|
| 查看次数: |
743 次 |
| 最近记录: |