【发布时间】:2017-12-09 23:54:10
【问题描述】:
void foo(const std::vector<int>& value) {
std::vector<int>::iterator it = value.begin();
/* functions that increment it */
}
我需要获取非常量迭代器来迭代 const 对象,我将迭代器传递给另一个函数,然后将其递增。但是我在尝试将 const_iterator 转换为迭代器时遇到错误。我如何获得非常量迭代器(如果可能的话)。
void foo(std::vector<int>& value) {
std::vector<int>::iterator it = value.begin();
/* functions that increment it */
}
当然我尝试过使用非常量引用,但它不允许我像这样调用函数...
object.foo({0,1});
而且我知道最简单的解决方案是不要将其作为参考,而是作为副本
void foo(std::vector<int> value) {
std::vector<int>::iterator it = value.begin();
/* functions that increment it */
}
但我想让它尽可能有效(时间和记忆)。
【问题讨论】:
-
如果您想从常量容器中获取非常量迭代器,那么您可能做错了什么。我建议你回到你的设计,看看你能不能想出一些不增加这个要求的东西。
-
为什么需要非常量迭代器来迭代 const 对象?如果你需要修改它,为什么你首先要有一个 const 向量?
-
将
std::vector<int>::iterator更改为std::vector<int>::const_iterator。在 C++11 及更高版本中,使用auto并让编译器解决它,或者使用基于范围的 for 循环。更一般地说,阅读标准容器的文档。递增迭代器(改变它引用的容器的元素)和能够使用迭代器改变容器的元素是有区别的。你把两者混淆了。 -
如果你的向量是
const,你的迭代器必须是const_iterator,即`std::vector::const_iterator it = value.begin();` -
如果你不修改向量的元素,
const_iterator就足够了。如果您有其他需要iterator的函数,则需要修改它们以能够接受const_iterator。试图强制const容器为您提供iterator(允许将容器视为不是const)是错误的方法。