2012-03-12 1 views
2

Почему нет функции «найти» в ассоциативных контейнерах std (map, set и т. Д.), Которая возвращает логическое значение?Почему нет более простой функции поиска для ассоциативных контейнеров std

Скажи:

std::map <int,int> mMap; 
... 
if (mMap.contains(75)) ... 

Я знаю, о находке() и что я могу сделать это таким образом

if (mMap.find(75) != mMap.end()) ... 

Но я чувствую это загромождает код больше, чем все остальное.

Почему нет более простой функции для этого, я имею в виду, что контейнеры довольно много находят в них вещи?

+1

Как обычно, никаких проблем с downvotes но, пожалуйста, скажите, почему. Вы знаете, никакого наказания без образовательной ценности ;-) – Valmond

+4

['std :: map :: count'] (http://en.cppreference.com/w/cpp/container/map/count) будет делать то, что вы хотите. – KillianDS

+0

Достаточно близко, чтобы ответить (если вы опубликуете его, я приму это)! – Valmond

ответ

1

Вы можете сделать свой собственный (примечание, это «HasKey», потому что «Содержит» будет иметь дело со значениями)

template <class AssocContainer> 
bool HasKey(const AssocContainer& haystack, 
    const typename AssocContainer::key_type& needle) 
{ 
    return haystack.find(needle) != haystack.end(); 
} 

map<int, int> m; 
m[0] = 1; 
bool b = HasKey(m, 0); 
+0

Да, это сработает +1, но это тоже затмит. – Valmond

3

Одна простая причина в том, что это бесполезно (и делает вас более неэффективным).

Подумайте об этом таким образом, когда вы говорите:

mMap.find(75) 

вы ищете 75, но для чего? Вы хотите использовать его позже!

Итак, зачем писать if (mMap.find(75) != mMap.end()), а затем позже найти 75?

Вы можете написать:

std::map<int, int> mMap; 
std::map<int, int>::iterator whatIWant = mMap.find(75); 
if (whatIWant != mMap.end()) 
{ 
    int mapsTo = whatIWant->second; 
    ... 
} 

Это означает, что вы выдаете find один раз, и вы получите результат как contains и фактический узел в карте.

+0

Да, я подумал об этом, но это не всегда так, иногда мне нужно проверить, существует ли значение перед использованием mMap [57] .foo = 1; поэтому я случайно не создаю новую запись. Кстати, вы уверены, что подобные вещи не оптимизируются компилятором в наши дни? – Valmond

+1

@ Valmond - случай, который вы перечисляете, - это именно тот случай, который описывает Шахбаз. Замените выражение 'whatIWant.second.foo = 1'. Это позволит избежать избыточного поиска. –

+1

Есть много вариантов использования, где вы просто хотите знать, есть ли он там, и не делать с ним ничего другого. – visitor

1

Я считаю, что ответ заключается в том, что функция поиска имеет 2 обязанности в этом случае, вы можете использовать один и тот же код, чтобы делать две разные вещи, находить что-то и проверять, существует ли это так, что меньше ошибок кода меньше, чем обычно.