как использовать алгоритм поиска для вектора

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

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

<1, 2>

<3, 5>

<3, 4>
...

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

Спасибо,


person Fihop    schedule 06.05.2011    source источник
comment
вам нужно прояснить свой вопрос. Вы хотите 1. наименьшее значение в первом столбце (т. е. первый член пары), 2. произвольное значение, которое нужно искать как значение первого члена пары. Решения сильно различаются, как вы можете видеть ниже. Кроме того, если вектор уже отсортирован, что не так с итератором начала?   -  person Nim    schedule 07.05.2011


Ответы (4)


Стараюсь изо всех сил сделать ответ общим:

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
}
person sehe    schedule 06.05.2011
comment
А если первый (самый низкий/наименьший) ключ равен 4... или 28... или -212... или вообще неизвестен? (Я делаю предположение, что самый низкий ключ является первым.) - person Sani Singh Huttunen; 07.05.2011
comment
@Sani: В вопросе не упоминается самый низкий или минимальный или что-то еще. Мой код ищет конкретное значение, и я взял 1 в качестве значения из примера вопроса. Но вы можете использовать match_first<int>(4), match_first<int>(28), match_first<int>(-212) или даже match_first<int>(totally_unknown). - person sehe; 07.05.2011
comment
Верно для всех, кроме match_first‹int›(totally_unknown). Вы не можете найти то, что вы не знаете, что искать. - person Sani Singh Huttunen; 07.05.2011
comment
@Почему бы и нет? Разве вы раньше не слышали о переменных? Просто попробуйте, например. int totally_unknown; cin >> totally_unknown; читает его из консоли - person sehe; 07.05.2011
comment
Хорошо... позвольте мне объяснить вам кое-что о программировании... Есть переменные и есть алгоритмы... Вы можете установить значение для переменной... Но это значение должно быть известно... Если вы этого не сделаете, Не зная значения, которое вы ищете, вы не можете установить это значение для переменной... Вот где появляются алгоритмы... Если все, что вы знаете, это то, что вы хотите найти наименьшее значение ключа, то это то, что вы будете искать ... не конкретное заданное значение... И это то, что делает алгоритм... ;) - person Sani Singh Huttunen; 07.05.2011
comment
Ладно, я думаю, ты не шутишь. Желаю вам счастливо найти все самые низкие ценности, которые вы можете найти в мире. - person sehe; 07.05.2011
comment
На самом деле, если вы хотите изо всех сил быть универсальным… template<class K> struct match_first_type { K k; match_first_type(K k) : k(k) {} template<class T> bool operator()(T const &x) { return x.first == k; } }; template<class K> match_first_type<K> match_first(K k) { return k; } Используйте как match_first(1) без указания int в качестве аргумента шаблона. - person Fred Nurk; 07.05.2011
comment
@Sani: именно потому, что я просмотрел некоторые другие ваши ответы, я достаточно уважаю вас, чтобы не кричать на вас. Однако, честно говоря, я думаю, что вы, возможно, немного переборщили, вероятно, потому, что C++, возможно, не является вашей областью знаний. Никто не пострадал. Мы все здесь, чтобы помочь - person sehe; 07.05.2011
comment
Спасибо @Fred :) Я играл с этой мыслью, но решил не включать ее, потому что у меня было предчувствие, что мой ответ будет выглядеть ... достаточно пугающим без лишних строк. Но, да, дополнительный кредит полностью! - person sehe; 07.05.2011
comment
@sehe: Ну ... я бы не сказал, что я эксперт по C ++, но я знаю, как это сделать, и время от времени использую его профессионально ... Несмотря на то, что вопрос не был помечен как C ++ в то время, когда я написал мой ответ... Но НАСТОЯЩИЙ вопрос должен заключаться в том, что на самом деле задает здесь ОП... Мое предположение заключалось в том, что он хотел найти самый низкий/наименьший ключ... Другими предположениями являются первая пара ключ-значение или конкретный пара ключ-значение с известным значением ключа... Все разные предположения верны, поскольку OP не определяет правила... Я просто хотел подчеркнуть, что вы сделали предположение так же, как и я... - person Sani Singh Huttunen; 07.05.2011
comment
@sehe, на самом деле у Сани есть точка зрения (не о его программном комментарии), а о том, что нужно ОП - не совсем ясно, ищет ли ОП алгоритм для поиска произвольного значения или то, что он считает первым элементом ( что можно интерпретировать как самое низкое). - person Nim; 07.05.2011
comment
@Nim хорошая мысль: пусть решает ОП. Между тем, я нахожусь в хорошей компании людей, которые сразу же «знали» (возможно, ошибочно), что ОП означает pair::first, поэтому мне не придется смущаться, когда выяснится, что я ошибался. Ваше здоровье - person sehe; 07.05.2011
comment
Неважно (по крайней мере для меня) кто прав, а кто нет. Только то, что ОП получает ответ, который он / она ищет. Все ответы верны, пока ОП не укажет правила более подробно. - person Sani Singh Huttunen; 07.05.2011

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

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!
    }
person MerickOWA    schedule 06.05.2011
comment
А если значение первого (наименьшего/наименьшего) ключа неизвестно? Вы предполагаете, что первый ключ всегда равен 1. Это может быть 4, 8, -212 или что-то еще... - person Sani Singh Huttunen; 07.05.2011
comment
@Sani Huttunen, ничто в синтаксисе лямбда С++ не мешает использовать переменную. Я только указал на этот пример как на очень краткий способ, который не требует реализации всего класса (или, скорее, позволяет компилятору сделать это). - person MerickOWA; 07.05.2011
comment
Верно в большинстве случаев. Но если вы не знаете значение искомого ключа, этот подход не сработает. - person Sani Singh Huttunen; 07.05.2011
comment
@Sani Huttunen, я предполагаю, что под первым элементом он подразумевает пару‹int,double›::first не v[0] - person MerickOWA; 07.05.2011
comment
@MerickOWA, это такое же верное предположение, как и мое. Вы возвращаете пару ключ-значение, где ключ равен 1 (или любому другому заранее определенному значению, которое вы выберете). Вы предполагаете, что известно первое значение ключа. А если неизвестно? Конечно, ОП не хватает важной информации, чтобы правильно определить, что запрашивает ОП. - person Sani Singh Huttunen; 07.05.2011
comment
На самом деле, в 0x я бы написал: for (auto &x : v) { if (x.first == 1) { do_stuff_with(x); /*break if you only want to find the first instead of all*/ } } - person Fred Nurk; 07.05.2011
comment
@Fred, это круто, я не знал о новом синтаксисе for - person MerickOWA; 07.05.2011

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

person Dan D.    schedule 06.05.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 во время инициализации.

person Sani Singh Huttunen    schedule 06.05.2011
comment
Где в вопросе упоминается поиск минимального значения? Кроме того, поощрять внедрение нового алгоритма сортировки/поиска... плохой совет - person sehe; 07.05.2011
comment
Нигде... это предположение, которое я сделал... Поскольку ключи 1, 3, 3, я предположил, что примеры ключей никоим образом не важны для того, как должен работать упомянутый алгоритм. Алгоритм должен найти наименьшее значение ключа (допущение) согласно примеру. - person Sani Singh Huttunen; 07.05.2011
comment
Вы уверены, что он хочет найти конкретный ключ? И почему понижение общего рабочего алгоритма? - person Sani Singh Huttunen; 07.05.2011
comment
На самом деле, посмотрев на вопрос ОП, для этого решения есть смысл, намерения не ясны. ОП конкретно не говорит, что ищет произвольное значение, только первое (что бы это ни значило для ОП). Так что +1 пока... - person Nim; 07.05.2011