【问题标题】:Why can't I delete an element in my vector?为什么我不能删除向量中的元素?
【发布时间】:2012-10-28 14:26:28
【问题描述】:

我正在处理一个相当长的程序,但在从向量中删除元素时遇到了困难。我试图用一个非常简单的向量来做到这一点,并且遇到了同样的问题。据我所知,我的做法与每个人在其他人的问题中解释的方式相同。这是简单的代码。

vector<int> vect;
vect.push_back(3);
vect.push_back(2);
cout << vect[1];  // prints '2'
vect.erase(vect.begin()+1);
cout << vect[1] << endl; // prints '2'

我做错了什么?

上面的代码似乎有效,因为我检查了最后的大小,它打印了“1”。真正的代码却没有:

size = A[i]->B().size();
cout << "size is " << A[i]->B().size() << endl;  // prints 21
A[i]->B().erase(A[i]->B().begin()+size);
cout << "size now " << A[i]->B().size() << endl;  // prints 21

我看不出我做了什么不同的事情? A是一个向量,它存储了其他向量。我想删除 B 向量中的最后一个元素。

【问题讨论】:

  • +1 用于生成一个简单的示例;)
  • 你忘了解释你所期望的不同行为!
  • @Sandra 关于您的编辑,A[i]-&gt;B().begin()+size 指向最后一个元素之后的一个。因此,该行显示为A[i]-&gt;B().erase(A[i]-&gt;B().end());,并且没有任何内容被删除。要删除最后一个元素,A[i]-&gt;B().pop_back();
  • 我已经用我的实际代码编辑了我的问题 - 我希望删除“B”中的最后一个元素。
  • @Praetorian 我把它改成了 begin()+size-1 并且最后一行的尺寸仍然是 21。

标签: c++ vector erase


【解决方案1】:

擦除元素后,向量的大小变为 1(因为在擦除之前它是 2),本质上使您的表达式 vect[1] 导致未定义的行为,因为不再有索引为 1 的元素。剩下的就是一个元素(值 = 3,索引 = 0)。如果您使用vect.at(1) 而不是vect[1],则会抛出std::out_of_range

编辑后: 请记住,如果大小为N,则N 不是向量的有效索引!!!元素索引为0, 1, 2, ... N-1。所以确实,大小是1,因此唯一有效的索引是0

【讨论】:

  • 谢谢...我知道您仍然可以访问该位置,但不知道“at”。
【解决方案2】:

你正在做的是未定义的行为。基本上,您正在访问向量的当前最后一个元素,并且您碰巧找到了留在此处的垃圾。使用at 而不是[] 访问元素时问题很明显,因为at 具有内置范围检查。

// cout << vect[1] << endl;
cout << vect.at(1) << '\n';

如果您如上所述将[] 替换为at,您将收到std::out_of_range 异常,表明您提供的索引无效。

【讨论】:

  • 哈,当你发布你的答案时,我在我的答案中添加了关于 at 的部分。 +1
  • @ArmenTsirunyan:我只是希望 C++ 默认更安全,[] 有范围检查,而at 没有。新手不可避免地被更轻量级的语法所吸引(让人想起许多其他语言中的数组),并且在心跳中遇到未定义的行为:(
  • 我相信 MSVC 默认会在调试版本中对operator[] 执行范围检查。这是一个方便的功能,而且您无需为在 Release 版本中检查而付出代价。
  • @Praetorian:Dirkumware 的实现包含许多可以使用_HAS_ITERATOR_DEBUGGING_SECURE_SCL 激活的检查。如果我没记错的话,如果违规,您将点击assert,您的程序将中止。
【解决方案3】:

要删除向量中的最后一个元素,您可以使用.pop_back()。您还应该注意,将整数添加到迭代器是一个坏主意。请改用vector&lt;int&gt;::iterator 作为要添加的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-21
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多