Как стереть значение из вектора структуры с помощью идиомы erase-remove? - PullRequest
0 голосов
/ 16 января 2019

Как стереть все значения из вектора структуры, где значение структуры k равно 0?

struct tabuRecord {
int x;
int y;
int k;
tabuRecord( int x, int y, int k)
    : x(x), y(y), k(k){}
};  

vector <tabuRecord> tabu;

v.insert(v.begin(), tabuRecord(1, 2, 3));
v.insert(v.begin(), tabuRecord(4, 5, 0));
v.insert(v.begin(), tabuRecord(7, 8, 9));
v.insert(v.begin(), tabuRecord(10, 11, 0));

Я пытался

tabu.erase(std::remove(tabu.begin(), tabu.end(), tabu.k=0), tabu.end());

и

tabu.erase(std::remove(tabu.begin(), tabu.end(), tabuRecord.k=0), tabu.end());

Ответы [ 3 ]

0 голосов
/ 16 января 2019

std::remove требуется tabuRecord для сопоставления, поэтому вам нужно сделать что-то вроде.

tabuRecord value_to_remove(1,2,3);
tabu.erase(std::remove(tabu.begin(), tabu.end(), value_to_remove), tabu.end());

Если вы хотите удалить только на основе члена k, вам нужно использовать std::remove_if и передать соответствующую функцию, соответствующую ему.

auto match_func = [](const tabuRecord& obj) { return obj.k == 2; };
tabu.erase(std::remove_if(tabu.begin(), tabu.end(), match_func), tabu.end());
0 голосов
/ 16 января 2019

Попробуйте что-то вроде этого:

tabu.erase(
    std::remove_if(tabu.begin(), tabu.end(), [valueToErase](const tabuRecord & t) {
    return (t.x==valueToErase.x) && (t.y == valueToErase.y) && (t.k == valueToErase.k);
}), tabu.end());

Используется лямбда , которая возвращает true, если три поля равны, и удаляет все значения, если это так.

Вот полный пример:

#include <vector>
#include <algorithm>
#include <iostream>

int main(int argc, char **argv)
{
    tabuRecord valueToErase(1, 2, 3); // example value to remove

    tabu.push_back({ 1, 2, 3 });
    tabu.push_back({ 4, 5, 6 });
    tabu.push_back({ 1, 2, 3 });
    tabu.push_back({ 7, 8, 9 });

    tabu.erase(
        std::remove_if(tabu.begin(), tabu.end(), [valueToErase](const tabuRecord & t) {
        return (t.x==valueToErase.x) && (t.y == valueToErase.y) && (t.k == 
        valueToErase.k);
    }), tabu.end());

    for (tabuRecord t : tabu) {
        std::cout << "x: " << t.x << " y: " << t.y << " k: " << t.k << std::endl;
    } // print all entries to verify that the correct ones were removed

    return 0;
}

Кроме того, в вашем конструкторе есть ошибка, вы, вероятно, хотели это вместо того, чтобы устанавливать для всех полей одно и то же значение:

: x(x), y(y), k(k) {}
0 голосов
/ 16 января 2019

Полагаю, вы хотите удалить все объекты, которые имеют k==0, поэтому создайте для этого лямбду:

tabu.erase(
    std::remove_if(tabu.begin(), tabu.end(),[](const tabuRecord& t){return t.k == 0;}),
    tabu.end());

std::remove не может работать, потому что вы хотите удалить не одно значение, а все значения с определенным шаблоном, что и делает std::remove_if.

...