如何正确使用std:vector erase()函数?

时间:2011-07-21 22:40:09

标签: c++ vector erase

在std:vector上使用erase()函数时遇到一个奇怪的问题。我使用以下代码:

int count = 0;
for (int itr=0; itr<b.size(); ++itr) {
    if (b[count].notEmpty = false) {
        b.erase(b.begin()+count);
        --count;
    }
    ++count;
}

然而,由于某种原因,实际上没有任何元素从b中删除。 b在其他地方声明如下:

vector<block_data> b;

其中block_data是一个结构,并包含布尔值notEmpty。某些b的元素在代码中较早地正确分配了notEmpty = false,因此我不确定它们为什么不被删除。是语法错误还是其他错误?

3 个答案:

答案 0 :(得分:8)

使用erase没有任何问题。问题是if条件中的赋值:

if(b[count].notEmpty = false)

这会将b[count].notEmpty设置为false,然后返回false。这将导致if语句的内部主体永远不会运行。

将其更改为

if(b[count].notEmpty == false)

或事件

if(!b[count].notEmpty)

你应该好好去。

答案 1 :(得分:3)

其他人已经指出了如何修复代码,但以防万一:如何使用标准算法。

// Decide if an element is to be removed
auto predicate = [](block_data& b)
{
    // more idiomatic than b.notEmpty == false
    return !b.notEmpty;
});

// Remove
auto removed = std::remove_if(b.begin(), b.end(), predicate);

// Count
auto count = b.end() - removed;

// Erase.
b.erase(removed, b.end());

答案 2 :(得分:2)

b[count].notEmpty = false应为b[count].notEmpty == false,否则if将始终为false

更好地练习写false == b[count].notEmpty,这样左边的常量不是l值,如果你犯了=而不是{{1}的(很常见的)错误你会得到编译错误。