当我使用迭代器时,我遇到了一个问题,似乎是对 const 的某种隐式转换。我不太确定哪个代码是相关的(如果我知道我可能不会问这个问题!)所以我会尽力说明我的问题。
typedef set<SmallObject> Container; //not const
void LargeObject::someFunction() { //not const
Container::iterator it; //not const
for (it = c.begin(); it != c.end(); ++it) { //assume c is a "Container"
(*it).smallObjectFunction(); //not a const function
}
}
但是我总是得到以下错误:
error: passing 'const SmallObject' as 'this' argument of 'int SmallObject::smallObjectFunction()' discards qualifiers
但是,如果我将其转换为 ((SmallObject)(*it).smallObjectFunction();
然后我就摆脱了错误消息。
我唯一能想到的是
bool operator< (const SmallObject &a) const;
以某种方式导致迭代器返回 const 对象。这里有什么帮助或解释吗?
最佳答案
集合和映射根据排序条件使元素保持有序。对于不破坏不变量的用户代码,映射的 key
和集合中的整个元素必须是常量。您的问题是存储的元素不是 SmallObject
,而是 const SmallObject
。
如果这不受限制,你可以:
int init[] = { 1, 2, 3, 4, 5 };
std::set<int> values( init, init+5 );
std::copy( values.begin(), values.end(),
std::ostream_iterator<int>(std::cout, " "));
// 1 2 3 4 5
*(values.find(3)) = 5; // luckily this does not work!
std::copy( values.begin(), values.end(),
std::ostream_iterator<int>(std::cout, " "));
// 1 2 5 4 5 -- not in order!!!
问题不仅在于集合元素现在没有顺序,而且根据树的构建方式,集合中可能存在但找不到的元素。
关于c++ - STL 迭代器和 'const',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3354346/