【问题标题】:How to iterate over const object with iterator?如何使用迭代器迭代 const 对象?
【发布时间】: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&lt;int&gt;::iterator 更改为std::vector&lt;int&gt;::const_iterator。在 C++11 及更高版本中,使用 auto 并让编译器解决它,或者使用基于范围的 for 循环。更一般地说,阅读标准容器的文档。递增迭代器(改变它引用的容器的元素)和能够使用迭代器改变容器的元素是有区别的。你把两者混淆了。
  • 如果你的向量是const,你的迭代器必须是const_iterator,即`std::vector::const_iterator it = value.begin();`
  • 如果你不修改向量的元素,const_iterator 就足够了。如果您有其他需要 iterator 的函数,则需要修改它们以能够接受 const_iterator。试图强制const 容器为您提供iterator(允许将容器视为不是const)是错误的方法。

标签: c++ c++11 iterator


【解决方案1】:

使用 std::vector::const_iterator。

【讨论】:

  • 我觉得很有趣,第一句话是“我需要让非常量迭代器来迭代 const 对象”,嗯...
猜你喜欢
  • 1970-01-01
  • 2011-11-22
  • 2020-10-02
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2019-06-03
  • 2013-11-25
  • 2022-09-30
相关资源
最近更新 更多