как использовать алгоритм поиска для вектора - PullRequest
4 голосов
/ 07 мая 2011

Если элемент вектора имеет тип pair , например vector<pair<int, double>>.Я хочу, чтобы алгоритм поиска фокусировался на первом элементе моего вектора.Как мне это сделать?

Например, мои данные следующие:

<1, 2>

<3, 5>

<3, 4>
...

Я хочу найти 1 в первом столбце.

Спасибо,

Ответы [ 4 ]

4 голосов
/ 07 мая 2011

Изо всех сил стараюсь ответить generic :

template <typename K>
struct match_first
{
    const K _k; match_first(const K& k) : _k(k) {}
    template <typename V>
        bool operator()(const std::pair<K, V>& el) const 
    {
        return _k == el.first;
    }
};

используйте его, например,

it = std::find_if(vec.begin(), vec.begin(), match_first<int>(1));

if (it!=vec.end())
{ 
    // found
}
2 голосов
/ 07 мая 2011

Если вы используете более новый компилятор C ++, вы можете написать

int value_to_find = 1;
auto it = find_if( v.begin(), v.end(), [=]( const pair<int,double> &p ) { return p.first == value_to_find; } );
if ( it != v.end() ) {
    // found!
    }
1 голос
/ 07 мая 2011

почему бы не использовать multimap<int, double> вместо vector?его .find(1) даст итератор, который даст пару pair<int, double>(1,2), как в вашем примере;http://www.sgi.com/tech/stl/Multimap.html

0 голосов
/ 07 мая 2011

Независимо от языка / платформы это то, что вам нужно сделать (в псевдокоде):

min = MAXIMUM_INTEGER_VALUE
minValue = 0
for each (element in vector)
  if (element.key < min)
    min = element.key
    minValue = element.value
  end if
loop for

Теперь у вас должен быть наименьший ключ и его значение в min и minValue соответственно.Вы МОЖЕТЕ в крайнем случае, когда все ключи равны MAXIMUM_INTEGER_VALUE, в результате вы получите неправильный результат.Решением было бы присвоить первому значению элемента значение minValue вместо 0 во время инициализации.

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