3

在 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,所以我不确定为什么它们没有被删除。是语法错误还是其他原因?

4

3 回答 3

8

您使用 . 没有任何问题erase。问题是if条件内的分配:

if(b[count].notEmpty = false)

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

将其更改为

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

或事件

if(!b[count].notEmpty)

你应该很高兴。

于 2011-07-21T22:43:58.093 回答
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());
于 2011-07-21T23:08:08.000 回答
2

b[count].notEmpty = false应该是b[count].notEmpty == false,否则if永远都是false

更好的做法是写false == b[count].notEmpty,这样左边的常量不是左值,如果你犯了(很常见的)写错误=而不是==你会得到一个编译错误。

于 2011-07-21T22:41:43.090 回答