Независимо от того, что высказали другие (необходимо указать конкретный параметр шаблона), вы пропускаете вызов std::vector::erase
(или вызов vec_data.resize()
является избыточным).
std::remove_if
делает не уменьшение размера контейнера!
Итак, либо добавьте отмеченную строку
auto it = remove_if(vec.begin(), vec.end(), flag_delete<T>);
vec.erase(it); // <-- ADD THIS TO ACTUALLY REDUCE CONTAINER LENGTH
n = vec.size();
vec_data.resize(n);
Или переписать немного. Зная, что векторное распределение является смежным в соответствии со стандартом, вы можете сжать все это до (при условии поддержки c ++ 0x):
template <class T> void simpler(vector<T> &vec_data, const ivec &vec_flag)
{
T *begin = &vec_data.front();
size_t newsize = std::distance(begin,
std::remove_if(
begin, begin + vec_data.size(), [&] (T& el)
{
return 1 == vec_flag[std::distance(begin, &el)];
}));
vec_data.resize(newsize);
}
Посмотреть вживую: http://ideone.com/S2WUC
Редактировать Я также немного очистил исходную функцию (примечание const&
, size_t
, erase
, reserve
и std::make_pair
):
template <class T> void fun_delete_by_flag(vector<T> &vec_data, const ivec &vec_flag)
{
size_t n = vec_data.size();
vector< pair<T,int> > vec;
vec.reserve(n);
for ( size_t i = 0; i < n; i += 1 )
vec.push_back(std::make_pair(vec_data[i], vec_flag[i]));
vec.erase(remove_if(vec.begin(), vec.end(), flag_delete<T>));
n = vec.size();
vec_data.resize(n);
for ( size_t i = 0; i < n; i += 1 )
vec_data[i] = vec[i].first;
return;
}