[C++] 如何查找给定的键是否存在于C ++ std :: map中


Answers

要检查映射中的特定键是否存在,请使用以下方法之一使用count成员函数:

m.count(key) > 0
m.count(key) == 1
m.count(key) != 0

map::finddocumentation说:“另一个成员函数map::count可以用来检查一个特定的键是否存在。”

map::countmap::count说:“因为地图容器中的所有元素都是唯一的,所以函数只能返回1(如果找到元素)或者返回0(否则)。”

要通过您知道存在的键从地图中检索值,请使用map::at

value = m.at(key)

map::operator[] ,如果指定的键不存在, map::at不会在映射中创建新键。

Question

我试图检查一个给定的键是否在地图中,有些不能这样做:

typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want
cout << p.first;//I'm getting error here

那我该如何打印p中的内容呢?




m.find == m.end() // not found 

如果你想使用其他API,那么找到m.count(c)>0

 if (m.count("f")>0)
      cout << " is an element of m.\n";
    else 
      cout << " is not an element of m.\n";



map <int , char>::iterator itr;
    for(itr = MyMap.begin() ; itr!= MyMap.end() ; itr++)
    {
        if (itr->second == 'c')
        {
            cout<<itr->first<<endl;
        }
    }



template <typename T, typename Key>
bool key_exists(const T& container, const Key& key)
{
    return (container.find(key) != std::end(container));
}

当然,如果你想变得更漂亮,你总是可以模拟出一个函数,该函数也使用了一个找到的函数和一个未找到的函数,如下所示:

template <typename T, typename Key, typename FoundFunction, typename NotFoundFunction>
void find_and_execute(const T& container, const Key& key, FoundFunction found_function, NotFoundFunction not_found_function)
{
    auto& it = container.find(key);
    if (it != std::end(container))
    {
        found_function(key, it->second);
    }
    else
    {
        not_found_function(key);
    }
}

并像这样使用它:

    std::map<int, int> some_map;
    find_and_execute(some_map, 1,
        [](int key, int value){ std::cout << "key " << key << " found, value: " << value << std::endl; },
        [](int key){ std::cout << "key " << key << " not found" << std::endl; });

这样做的缺点是会出现一个好名字,“find_and_execute”很尴尬,我不能在头顶上想出更好的东西......




map<string, string> m;

检查键是否存在,并返回发生的数字(地图中的0/1):

int num = m.count("f");  
if (num>0) {    
    //found   
} else {  
    // not found  
}

检查键是否存在,并返回迭代器:

map<string,string>::iterator mi = m.find("f");  
if(mi != m.end()) {  
    //found  
    //do something to mi.  
} else {  
    // not found  
}  

在你的问题中,由于operator<<重载导致的错误,因为p.firstmap<string, string> ,所以你不能打印出来。 尝试这个:

if(p.first != p.second) {
    cout << p.first->first << " " << p.first->second << endl;
}