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

の使用に問題はありませんeraseif問題は、条件内の割り当てです。

if(b[count].notEmpty = false)

これはに設定b[count].notEmptyされfalse、次に。を返します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このように、左側の定数はl値ではなく、(かなり一般的な)書き込みの間違いを=すると==、コンパイルエラーが発生します。

于 2011-07-21T22:41:43.090 に答える