簡體   English   中英

檢查向量和 map 是否包含值的模板

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM