Поиск значения в c'or функтора - PullRequest
0 голосов
/ 02 августа 2011

Скажем, у меня был std::vector<std::pair<int, std::vector<int> > >, то есть вектор, содержащий пары целых чисел к векторам. (Я знаю, что могу добиться того же с помощью карты, но я не об этом спрашиваю)

Как бы я искал int (тот, что в паре), используя STL? Я написал решение, которое работает:

struct FindFirst {
    FindFirst(int i) : toFind(i) { }
    int toFind;
    bool operator() 
        ( const std::pair<int, std::vector<int> > &p ) {
            return p.first==toFind;
    }
};

Это можно использовать так:

int valueToFind = 4;
std::find_if(myVec.begin(), myVec.end(), FindFirst(valueToFind));

Но мне это кажется немного уродливым; должен быть лучший способ. Так есть ли лучше способы сделать это без с использованием чего-либо из C ++ 0x или Boost? (Потому что я пытаюсь изучить лучший способ сделать это, и я подчеркиваю, только STL )

EDIT: Похоже, есть небольшая путаница в том, что я спрашиваю. Больше всего меня интересует, является ли плохой практикой использование конструктора для поиска значений в функторе, особенно когда они используются в алгоритмах STL.

Ответы [ 3 ]

4 голосов
/ 02 августа 2011

Это лучший способ сделать это, когда используется только STL.Что именно вам не нравится в этом (кроме, может быть, его многословия)?

Это универсально, потому что вы можете использовать с другими алгоритмами, такими как, например, std::binary_search.

Это довольно просто и прямо (по крайней мере, для кого-то, привыкшего к функторам C ++).

Единственное, что по-настоящему улучшило бы это, - это выбор структуры данных.Такие варианты использования покрываются std::map, и вы не объяснили, почему вы не можете его использовать.Я понимаю, что для ваших реальных проблем карта действительно может не подходить, но в этом случае ваш пример не соответствует вашей реальной проблеме.Вы должны это исправить.

1 голос
/ 02 августа 2011

Нет, передача параметра в функцию предиката - это неплохая практика.На самом деле это делает предикат достаточно гибким.

Альтернативой является использование глобальной переменной - которую я бы назвал плохой практикой для использования предиката.

1 голос
/ 02 августа 2011

почему бы не использовать прямые вызовы STL

void FindFirst(std::vector<std::pair<int, std::vector<int> > >& v, int intToLookFor)
{
   std::vector<std::pair<int, std::vector<int> > >::iterator iItr;
   for (iItr = v.begin(); iItr != v.end(); ++iItr)
   {
       if (iItr->first == intToLookFor) return;
   }
}

(Простите за имена переменных ;-)). Также возвращаемое значение из этой функции может быть итератором или ссылкой на векторное значение ...

...