簡體   English   中英

如何在不插入的情況下檢查 std::map 是否包含鍵?

[英]How to check if std::map contains a key without doing insert?

我發現檢查重復項的唯一方法是插入並檢查std::pair.second是否為false ,但問題是如果密鑰未使用,這仍然會插入一些東西,而我想要的是map.contains(key); 功能。

使用my_map.count( key ) 它只能返回 0 或 1,這本質上是您想要的布爾結果。

或者my_map.find( key ) != my_map.end()也可以。

Potatoswatter 的答案是可以的,但我更喜歡使用findlower_bound來代替。 lower_bound特別有用,因為如果您希望插入具有相同鍵的內容,則返回的迭代器隨后可用於提示插入。

map<K, V>::iterator iter(my_map.lower_bound(key));
if (iter == my_map.end() || key < iter->first) {    // not found
    // ...
    my_map.insert(iter, make_pair(key, value));     // hinted insertion
} else {
    // ... use iter->second here
}

您的需求map.contains(key)計划用於標准C++2a草案並在 C++20 中實現。 2017 年由gcc 9.2實現。 它也在clang中。

我知道這個問題已經有了一些好的答案,但是我認為我的解決方案值得分享。

它適用於std::mapstd::vector<std::pair<T, U>> ,可從C ++ 11獲得。

template <typename ForwardIterator, typename Key>
bool contains_key(ForwardIterator first, ForwardIterator last, Key const key) {
    using ValueType = typename std::iterator_traits<ForwardIterator>::value_type;

    auto search_result = std::find_if(
        first, last,
        [&key](ValueType const& item) {
            return item.first == key;
        }
    );

    if (search_result == last) {
        return false;
    } else {
        return true;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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