我对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
对象作为其参数吗?
答案 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);
}