2013-04-10 2 views
1

У меня есть структура формы приведены ниже:Удалить элементы из вектора, определяемых пользователем типа данных в C++

struct A{ 
    int t; int j;} 

Объекты STRUCT А содержит следующие значения:

 t  j 
    20  191 
    111 18 
    888 90   

у меня есть сохранял все эти объекты в std :: vector. Теперь я хочу, чтобы удалить элементы из этого вектора, где т == 111 и J < 20. Теперь я Перебор вектора, чтобы удалить элементы в порядке приведены ниже:

std::vector<A>::size_type i = 0; 
while (i < v.size()) { 
    if ((v[i].t==111) && (v[i].j<20)) { 
     v.erase(v.begin() + i); 
    } else { 
     ++i; 
    } 
} 

Вместо перебора является существует лучший способ удалить элементы в std :: vector определенных пользователем типов данных.

ответ

3

Да:

#include <algorithm> 

v.erase(std::remove_if(v.begin(), v.end(), 
         [](A const & x) { return x.t == 111 && x.j < 20; }), 
     v.end()); 
+0

Не могли бы вы объяснить, что означает «[] (A const & x)» подразумевает стирание функции. – user1778824

2

Похоже, вы хотите использовать erase-remove idiom с std::remove_if:

v.erase(std::remove_if(v.begin(), v.end(), [](const A& a) { 
    return a.t == 111 && a.j < 20; 
}), v.end()); 

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

+0

Можете ли вы объяснить, что означает «[] (A const & x)» подразумевает стирание функции. – user1778824

+0

@ user1778824 '[] (const A & a) {...}' является выражением лямбда. Для этого вам нужен компилятор C++ 11. –

+0

Я использую gcc как компилятор ... это сработает для меня ... если нет, то предложите альтернативу – user1778824

Смежные вопросы