Поиск и удаление элемента из вектора указателей?

#c #vector

#c #вектор

Вопрос:

 vector<unsigned int> x;
vector<unsigned int>::iterator itr;
unsigned int varF;
...
....

// find and delete an element from a vector.
itr = std::find(x.begin(), x.end(), varF);  // <algorithm>
if (itr != x.end()) 
x.erase(itr);
//or
x.erase(std::remove(x.begin(), x.end(), varF), x.end()); 
  

Я хочу преобразовать этот вектор в вектор указателей

 vector<unsigned int*> x;
  

Как я могу преобразовать вышеуказанную функциональность для вектора указателей?

Комментарии:

1. Как вы думаете, зачем вам нужны указатели?

2. Это должно выглядеть абсолютно одинаково. Что именно у вас пошло не так? Единственное замечание заключается в том, что, возможно, вам нужно освободить указатель до / после удаления его из вектора.

Ответ №1:

Используйте find_if вместо find или remove_if вместо remove , чтобы использовать пользовательский предикат:

 struct FindIntFromPointer
{
  FindIntFromPointer(int i) : n(i) { }
  bool operator()(int * p) const { return n == *p; }
private:
  int n;
};

std::find_if(x.begin(), x.end(), FindIntFromPointer(varF));
x.erase(std::remove_if(x.begin(), x.end(), FindIntFromPointer(varF)), x.end());
  

Если у вас C 11, вы можете использовать лямбда-выражение вместо явного предиката:

 std::find_if(x.begin(), x.end(), [varF](int * p) -> bool { return varF == *p; });
  

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

Комментарии:

1. @user986789: Не беспокойтесь. Не стесняйтесь нажимать эту кнопку «Принять», если вы найдете ответ полезным 🙂