c++ - STL 迭代器和 'const'

标签 c++ iterator constants

当我使用迭代器时,我遇到了一个问题,似乎是对 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/

相关文章:

c++ - 接受一个参数并返回它的函数

c++ - 无法从 WindowsXP 上的子文件夹加载库

c++ - C++ 中的模板化 is_in() 函数(检查数组是否包含字符串)

java - 覆盖迭代器类型

c++ - WinDBG 适用于从 Visual Studio 2015 保存的转储,但不适用于任务管理器。显示异常代码 "not found"

rust - 如何让函数返回具有相同项目类型的两个迭代器之一?

c++ - 如何使用迭代器在 vector 中导航? (C++)

ios - ifndef,常量的定义和直接赋值

c++ - 如何在类中初始化静态常量指针?

c++ - 运行时读入 const int 的值 - C++