【问题标题】:C++ std::vector iterator acting strange, won't allow incrementationC++ std::vector 迭代器行为奇怪,不允许递增
【发布时间】:2020-03-10 00:25:59
【问题描述】:

我正在尝试在 C++ 中使用 std::vector,特别是 std::string 类型之一。但是,当我尝试将元素插入 std::vector 并打印出来时,迭代器的行为很奇怪。 以下代码仅打印“Segmentation Fault”:

std::vector<std::string> request;
auto it = request.begin();
request.insert(it, "foo");
request.insert(++it, "bar");
std::cout << request.front() + "\n";

当我让迭代器保持原样时,代码也会打印“分段错误”,即如果我不尝试增加它。如果我注释掉在代码中插入“bar”的行,即没有it 增量(++it),代码将打印“foo”。此外,我可以使用request.begin()request.end() 添加“bar”,它会打印正确的内容(分别为“bar”或“foo”)。我在这里问这个问题是因为这种行为与教程中在cplusplus.com 上给出的std::vector.insert() 显示的行为不匹配,它似乎也与在线的任何其他示例不匹配,而且我似乎无法弄清楚为什么它会打印“分段错误”,如果您尝试打印一个不存在的元素,我会假设会发生这种情况,或者至少当我在一个空向量上测试这个理论时会发生这种情况。

【问题讨论】:

  • insert 之后不要相信it 仍然有效。
  • 你专门引用的教程cmets "// it已经失效了,换一个新的:"

标签: c++ vector iterator segmentation-fault


【解决方案1】:

问题是it之后不需要是有效的迭代器

request.insert(it, "foo");

因此,在下一行使用++it,作为

request.insert(++it, "bar");

是未定义行为的原因。

你可以使用

it = request.insert(it, "foo");
request.insert(++it, "bar");

【讨论】:

  • 谢谢。我真的不明白教程中说的是什么。这很奇怪,也很烦人,但有时你必须在编程中遇到困难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 2018-07-24
  • 2018-01-26
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多