Нахождение и удаление элемента из вектора указателей? - PullRequest
1 голос
/ 10 октября 2011
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 Ответ

8 голосов
/ 10 октября 2011

Используйте 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; });

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...