Как правильно использовать функцию ed () std: vector? - PullRequest
3 голосов
/ 22 июля 2011

У меня странная проблема при использовании функции erase () в std: vector. Я использую следующий код:

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 ]

8 голосов
/ 22 июля 2011

Нет ничего плохого в том, что вы используете erase. Проблема заключается в назначении внутри условия if:

if(b[count].notEmpty = false)

Устанавливает b[count].notEmpty в false, затем возвращает false. Это приведет к тому, что внутреннее тело оператора if никогда не запустится.

Измените его на

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

или событие

if(!b[count].notEmpty)

И тебе пора идти.

3 голосов
/ 22 июля 2011

Другие указали, как исправить ваш код, но на всякий случай: как использовать стандартный алгоритм.

// 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 голосов
/ 22 июля 2011

b[count].notEmpty = false должно быть b[count].notEmpty == false, иначе if всегда будет false.

Лучше писать false == b[count].notEmpty, таким образом, константа слева не является l-value, и если вы сделаете (довольно распространенную) ошибку, написав = вместо ==, вы получите ошибку компиляции.

...