【问题标题】:Is it safe to use std::vector.erase(begin(), end()) or std::vector.erase(begin(), begin())?使用 std::vector.erase(begin(), end()) 或 std::vector.erase(begin(), begin()) 是否安全?
【发布时间】:2012-12-04 19:36:48
【问题描述】:

我想处理向量中的元素一段时间。为了优化这一点,我不想在处理项目时删除它,并在最后删除所有已处理的项目。

vector<Item*>::iterator it;
for(it = items.begin(); it != items.end(); ++it)
{
    DoSomething(*it);

    if(TimeIsUp())
    {
        break;
    }
}

items.erase(items.begin(), it);

it == items.end() 时使用擦除是否安全?在文档中,据说erase() 将删除 [first,last),这应该是安全的,但我想确定。

编辑:

使用 std::vector.erase(begin(), begin()) 安全吗?

【问题讨论】:

  • 我强烈建议不要使用vector 的常规指针。要么使用专门设计用于保存指针的容器,要么使用vector 的智能指针。 (一个可能的例外是向量不拥有它所指向的对象。)
  • @Cristy:我不认为这真的是重复的,另一个 Q 是关于崩溃的,因为增加了一个迭代器超出了end。它也只是偶然包含eraseend
  • 我确实想知道为什么向量不能是cleared。
  • @Damon 因为it 可能并不总是等于items.end()
  • @Praetorian:哦,我真愚蠢……你是对的。我读过“之后删除所有元素”而不是“删除所有处理元素”。

标签: c++ stl


【解决方案1】:

[first,last) 的意思是介于firstlast 之间的所有内容,包括first,但不包括last。它表示一个半开集。如果他们使用[first,last]last 也将包括在内;如果他们使用(first,last)firstlast,将被排除在外。

您的代码有问题。如果it 不等于end(),您希望删除it 处的元素。而不是items.erase (items.begin(),it),你应该使用

if (it != items.end()) {
   items.erase (items.begin(), it+1);
}
else {
   items.clear(); // same as items.erase (items.begin(), items.end())
}

【讨论】:

    【解决方案2】:

    回答您的编辑:是的,这也很好。 vec.erase(q1,q2) 被定义为擦除“[q1, q2) 范围内的元素”。在这里,两个论点是相同的。 [q1, q2) 被定义为 const 迭代器的有效范围。如果您可以对q1 执行一系列增量以达到q2,则认为范围是有效的——在这种情况下,该序列没有增量。事实上,标准专门定义了一个空范围:

    范围[i,i) 是一个空范围

    【讨论】:

      【解决方案3】:

      是的,这是正确的 - 这就是符号 [first, last) 的含义,end() 指向末尾。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-22
        • 2016-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-05
        • 1970-01-01
        • 2015-04-29
        相关资源
        最近更新 更多