映射的std :: for_each()给出无效的初始化错误

时间:2019-01-16 05:03:03

标签: c++ c++11 stl

我对STL特别是算法库还比较陌生。 我正在尝试使用std::multimap函数遍历std::string,其中键和值均为std::for_each()类型,并执行一些任务。

这是我的std::multimap

std::multimap<std::string, std::string> myMap;
for (int i = 0; i < 5; i++) {
    myMap.insert(std::make_pair("key", "value"));
}

下面是带有for_each()函数的行:

std::for_each(myMap.begin(), myMap.end(), ask);

ask()函数的定义如下:

void ask(std::pair<std::string, std::string>& entry) {
    // do something...
}

程序给我以下错误:

  

错误:类型的引用的无效初始化   类型表达式中的'std :: __ cxx11 :: basic_string&'   'std :: pair,   std :: __ cxx11 :: basic_string>'

我知道,问题出在for_each()函数的行上,我认为这是因为ask()函数的参数不正确。 但是据我所知,std::multimap的每个条目都表示为一个std::pair,所以ask()函数不应该将std::pair对象作为其参数吗?

3 个答案:

答案 0 :(得分:6)

std::multimap<std::string, std::string>的元素类型为std::pair<const std::string, std::string>。请注意const

答案 1 :(得分:3)

用于std::multimap的默认分配器是

std::allocator<std::pair<const Key, T>

因此std::multimap中的键是const,其类型为

std::pair<const std::string, std::string>

其中ask()期望参数作为对类型的引用

std::pair<std::string, std::string>

ask()更改为

void ask(std::pair<const std::string, std::string>& entry)
{
}

答案 2 :(得分:1)

您可以直接询问它,而不用猜测地图的元素类型。

void ask(std::multimap<std::string, std::string>::reference entry) {
    // do something...
}

为此地图类型创建类型别名可能是个好主意,这样您就不必重复它了

using myMap_t = std::multimap<std::string, std::string>;

void ask(myMap_t::reference entry) {
    // do something...
}

int main() {
    myMap_t myMap;
    for (int i = 0; i < 5; i++) {
        myMap.insert(myMap_t::value_type("key", "value"));
    }

    std::for_each(myMap.begin(), myMap.end(), ask);
}