如果我有课:
class T{
public:
int Id;
//some methods, constructor..
}
和其他课程:
vector<T> collection;
并想写一个方法:
T& getValue(int Id){
//scanning the vector till i find the right value
}
问题是通过迭代器扫描向量总是给出一个const值,所以我得到一个关于限定符的错误。那么如何从向量中获取值?但不是常数。
编辑:根据答案,我试图这样:
Group& Server::findGroup(unsigned int userId) const{
for(auto iterator=groups.begin();iterator!=groups.end();++iterator){
if(iterator->isInGroup(userId)){
return (*iterator);
}
}
//throw exception here
}
群组的定义: 矢量组;
这与我最初给出的完全相同,但现在T是Group。
答案 0 :(得分:3)
以下代码应该为您提供非const
迭代器并且工作正常:
for(vector<T>::iterator i = collection.begin();
i != collection.end(); ++i) {
if(Id != i->Id)
continue;
// Matching ID! do something with *i here...
break;
}
如果这没有帮助,请详细解释什么是坏的。
这里的问题是你声明中的const
:
Group& Server::findGroup(unsigned int userId) const //<==THIS
这意味着this
是const Server*
,因此其中的所有内容都是const
,包括groups
。这意味着groups.begin()
将返回const_iterator
而不是iterator
。
你可以做的一件事(可能不是一个好主意;你需要非常肯定!)将groups
标记为mutable
,这样就可以了即使其封闭对象为const
:
mutable vector<T> groups;
这样做会使groups.begin()
返回常规iterator
。
但是我会要求你重新评估为什么这个方法被声明为const
,因为你以一个可以改变的形式返回对象的一部分因此你并没有真正尊重const
。