[英]Template to check if vector and map contains value
我是c++
的初學者,我正在搜索可以檢查vector
/ map
獨立於其數據類型的模板,包含給定值,我發現了這些:
template <typename Container, typename Value>
bool vector_contains(const Container& c, const Value& v)
{
return std::find(std::begin(c), std::end(c), v) != std::begin(c);
}
template< typename container, typename key >
auto map_contains(container const& c, key const& k)
-> decltype(c.find(k) != c.end())
{
return c.find(k) != c.end();
}
我的疑問是,使用模板進行這種驗證會以某種方式影響性能嗎?
我找到了這些
好的,但請分析它們。 它們是次優的和/或完全錯誤的。
template <typename Container, typename Value>
bool vector_contains(const Container& c, const Value& v)
{
return std::find(std::begin(c), std::end(c), v) != std::begin(c);
}
只要v
不是找到的第一個值,這將返回true
。 如果根本沒有找到v
,它也會返回true
。
沒有任何其他信息的vector
是未排序的,這意味着如果未找到該值,則contains
必須從第一個元素搜索到最后一個元素。 這樣的搜索被認為是昂貴的。
另一方面,如果您在使用std::binary_search
時對vector
std::sort
並使用相同的Comparator ,則查找速度會更快。 不過,排序也需要時間。
template< typename container, typename key >
auto map_contains(container const& c, key const& k) -> decltype(c.find(k) != c.end())
{
return c.find(k) != c.end();
}
這看起來可能適用於與 function 模板匹配的類型。 它應該使用map::contains
代替 - 如果它打算與map
一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.