#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: Не беспокойтесь. Не стесняйтесь нажимать эту кнопку «Принять», если вы найдете ответ полезным 🙂