C ++检查密钥是否存在于Map中使用Map

时间:2013-11-21 02:23:08

标签: c++ c++11 map

我将地图定义为map<string, map<string,int> > grandMap;,我需要检查内部地图是否有密钥term。如果是这样,算一算吧。这是我已经尝试过的:

auto countOccurrences(string term) -> int
{
    int count = 0;
    for(auto entry : grandMap)
    {
        if(entry->second.find(term)!=entry->second.end())
        {
            count++;
            cout << "counted" << endl;
        }
    }
    return count;
}

但我收到以下错误:

415.cpp:50:11: error: base operand of '->' has non-pointer type 'std::pair<const std::basic_string<char>, std::map<std::basic_string<char>, int> >'
415.cpp:50:37: error: base operand of '->' has non-pointer type 'std::pair<const std::basic_string<char>, std::map<std::basic_string<char>, int> >'

...这明确指出我试图得到entry的第二个,我认为它是grandMap的一个元素,但它似乎并不像我想要的那样。

那么正确的方法是什么?

1 个答案:

答案 0 :(得分:5)

问题是您使用的是operator ->而不是operator .

if (entry.second.find(term) != entry.second.end())
//       ^                          ^

另外,为了避免过早的悲观化(请参阅this GoTW by Herb Sutter了解定义),您应该通过引用term接受const参数,并且还应该使用auto const&在基于范围的for循环中。

此外,count_if标准算法似乎正是您所寻找的:

// Using C++14's return type deduction for regular functions...
auto count(std::string const& term)
{
    return std::count_if(std::begin(grandMap), std::end(grandMap),
        [&] (decltype(grandMap)::value_type const& entry)
    {
        return (entry.second.find("hello") != std::end(entry.second));
    });
}

这是一个完整的程序:

#include <map>
#include <string>
#include <algorithm>
#include <iostream>

std::map<std::string, std::map<std::string, int>> grandMap =
    { { "1", { { "hello", 42 }, { "hi", 1337 } } },
      { "2", { { "hello", 42 }, { "hello", 1729 } } }};

auto count(std::string const& term)
{
    return std::count_if(std::begin(grandMap), std::end(grandMap),
        [&] (decltype(grandMap)::value_type const& entry)
    {
        return (entry.second.find("hello") != std::end(entry.second));
    });
}

int main()
{
    std::cout << count("hello");
}

以及相应的live example