【问题标题】:C++ STL: How to copy vector iterator?C++ STL:如何复制向量迭代器?
【发布时间】:2021-09-03 11:16:56
【问题描述】:

我有以下代码,由于read access violation 而失败:

#include <vector>
using namespace std;

vector<int>::iterator myIterator;

void foo(vector<int> vec) {
    myIterator = vec.begin(); 
}

int main()
{
    foo({ 10, 20, 30, 40 });
    *myIterator; // Here it fails.
    return 0;
}

经过一些调试,发现myIterator在函数foo()完成后就失效了。

那我做错了什么?

【问题讨论】:

  • 变量vec 在您标记的行之前消失了。你认为迭代器应该指向哪里?
  • 你得到了一个临时向量的迭代器。为此,您需要在main 中创建一个命名变量来保存向量,然后将其引用传递给foo
  • 这个例子很漂亮。它又短又甜。但这并不能真正让我们知道您的目标是什么,这使得我们很难提供最佳解决方案。
  • 你认为复制迭代器有什么作用?你认为迭代器是什么?
  • C++ 不是 Java 或 JavaScript。 C++ 是一种基于值的语言——当您按值传递向量时,会生成向量的副本,因此该副本会在函数返回后消失。没有像其他语言那样发生引用恶作剧,其中传递一个对象意味着传递了一个引用。如果你想要 C++ 中的引用,你必须明确告诉 C++ 你想要一个引用。

标签: c++ vector stl iterator


【解决方案1】:

vec 只定义在foo 的范围内。由于myIterator 是一个指向vec 的迭代器,它在foo 之外不再有效。尝试取消引用此类迭代器会导致读取访问冲突。

您需要在某处定义vec(例如在main),然后在foo 中传递对它的引用,例如:

void foo(vector<int>& vec) {
    myIterator = vec.begin();
}

int main() {
    vector<int> vec = {10, 20, 30, 40};
    foo(vec);
    *myIterator;
    return 0;
}

【讨论】:

  • 它不是一个空指针它是一个悬空指针
  • 考虑将其称为“无效迭代器”,因为它不一定是指针,当然也不是“null”。取消引用将是“未定义的行为”。承诺读取访问冲突是不正确的。
  • @DrewDormann 它是一个指向向量元素的指针。
  • @WaisKamal 看看std::vector::begin() returns 是什么。没有提到“指针”。另请参阅stackoverflow.com/questions/2728190
  • 技术上可能不涉及任何指针。迭代器通常使用指针实现,但并非必须如此。 Iterator 的很大一部分工作是隐藏真正发生的事情。
猜你喜欢
  • 2020-11-06
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 2016-10-11
  • 2010-10-23
相关资源
最近更新 更多