在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,因此我不确定它们为什么不被删除。是语法错误还是其他错误?
答案 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}的(很常见的)错误你会得到编译错误。