Нахождение объекта в векторе по одному из его значений - PullRequest
1 голос
/ 07 марта 2012

Проблема, с которой я столкнулся и не могу решить, выглядит примерно так.У меня есть два класса:

class1
{
private:
  int identifier;
  double value;
public:
  setters,getters,etc...
}
class2
{
private:
  vector<class1> objects;
  vector<int> some_value;
  vector<double> other_value;
...
}

Проблема в том, что мне нужно искать вектор объектов в объекте второго класса по его идентификатору в объекте class1 (из функции-члена class2).Я попробовал что-то вроде:

int getObj(const int &ident, double &returnedValue, double &returnedOther_value)
{
  int p;
  p = find(objects.begin()->getIdentifier(),objects.end()->getIdentifier(),ident);
  ..

.. и затем я надеялся найти способ вернуть из найденных значений итератора значение соответствующих (неконстантных) переменных-членов и other_value из обоих классов, нокод до сих пор не компилируется, потому что я, вероятно, все делаю поиск неправильно.Есть ли способ, которым я мог бы сделать это с помощью find (или любого другого алгоритма), или я должен придерживаться своей предыдущей рабочей реализации без алгоритмов?

1 Ответ

1 голос
/ 07 марта 2012

Вам нужно использовать find_if с пользовательским предикатом.Что-то вроде:

class HasIdentifier:public unary_function<class1, bool>  
{  
public:
    HasIdentifier(int id) : m_id(id) { }  
    bool operator()(const class1& c)const  
    {  
        return (c.getIdentifier() == m_id);  
    }  
private:
    int m_id;  
};  


// Then, to find it:
vector<class1>::iterator itElem = find_if(objects.begin(), objects.end(), HasIdentifier(ident));  

Я не проверял это, так что, возможно, он нуждается в некоторой настройке.

Если у вас есть C11, я думаю, вы можете использовать лямбды, но у меня неттак что у меня не было возможности выучить их.

ОБНОВЛЕНИЕ: я добавил пример в http://ideone.com/D1DWU

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