Как я могу приспособить идиому удаления-удаления для работы с векторными кортежами? - PullRequest
4 голосов
/ 09 мая 2019

У меня есть вектор кортежей с членами j, k и l.Я пытаюсь адаптировать идиому удаления-удаления, чтобы можно было удалить весь кортеж, если значение элемента .k соответствует определенному условию.

Я пытался использовать стандартную методологию .erase (removeif ()).где предикат ссылался на позицию члена кортежа, но ему было сказано, что у рассматриваемого класса вектора нет члена "k".

vec_list_iter_exp_out.erase(
    std::remove_if(
        vec_list_iter_exp_out.begin(),
        vec_list_iter_exp_out.end(), 
        vec_list_iter_exp_out.k < 33), vec_list_iter_exp_out.end());

Я бы ожидал, что если vec_list_iter_exp_out состоит из следующих, гипотетических значений:

vec_list_iter_exp_out[0] = 5, 22, 9
vec_list_iter_exp_out[1] = 12, 31, 54
vec_list_iter_exp_out[2] = 17, 42, 0
vec_list_iter_exp_out[3] = 253, 3, 5
vec_list_iter_exp_out[4] = 65, 110, 24

Чтобы полностью удалить vec_list_iter_exp_out [2] и vec_list_iter_exp_out [4], а vec_list_iter_exp_out будет состоять из следующего:

vec_list_iter_exp_out[0] = 5, 22, 9
vec_list_iter_exp_out[1] = 12, 31, 54
vec_list_iter_exp_out[2] = 253, 3, 5

Вместо этого я получу вышеупомянутую ошибку компиляции.

Любая помощь будет принята с благодарностью!

Редактировать: определение рассматриваемого вектора по запросу.

struct TriStore
{
    double j,k,l;
};

std::vector<TriStore> vec_list_iter_exp_out;

и фрагмент для вставки (очевидно, ссылаются на другие функции ичто бы у тебя, но это заняло бы слишком много места)

    for(int z = 1; z <= iters; z++)
    {
        vec_iters.push_back(vec_list_iter_exp_out.size());
        for(int i = vec_iters[z-1]; i < vec_iters[z]; i++)
        {
            if(vec_list_iter_exp_out[i].k < kk)
            {
                triangle_list(vec_list_iter_exp_out[i].j,vec_list_iter_exp_out[i].k,vec_list_iter_exp_out[i].l);
                vec_list_iter_exp_out.insert(vec_list_iter_exp_out.end(),vec_tri_list.begin(),vec_tri_list.end());
            }
        }
    }

1 Ответ

6 голосов
/ 09 мая 2019

Третий аргумент remove_if должен быть унарным предикатом.Вместо этого вы передаете выражение.

Вместо vec_list_iter_exp_out.k < 33 попробуйте что-то вроде [](const TriStore &x){return x.k < 33;}

Что, если я хочу решить это 33 во время выполнения

Из этого комментария Нишанта Сингха : Пожалуйста, используйте

[&value](const TriStore& x) {return x.k < value;}  // Capture by reference
[value](const TriStore& x) {return x.k < value;}  // Capture by value

пс вместо TriStore почему бы вам не использовать tuple<double, double, double>

...