C++ 映射的std::for_each()给出无效的初始化错误
我对STL比较陌生,尤其是算法库。 我试图使用C++ 映射的std::for_each()给出无效的初始化错误,c++,c++11,stl,C++,C++11,Stl,我对STL比较陌生,尤其是算法库。 我试图使用std::for_each()函数迭代std::multimap,其中键和值的类型都是std::string,并执行一些任务 这是我的std::multimap: std::multimap<std::string, std::string> myMap; for (int i = 0; i < 5; i++) { myMap.insert(std::make_pair("key", "value")); } ask()函
std::for_each()
函数迭代std::multimap
,其中键和值的类型都是std::string
,并执行一些任务
这是我的std::multimap
:
std::multimap<std::string, std::string> myMap;
for (int i = 0; i < 5; i++) {
myMap.insert(std::make_pair("key", "value"));
}
ask()
函数定义如下:
void ask(std::pair<std::string, std::string>& entry) {
// do something...
}
void ask(std::pair&entry){
//做点什么。。。
}
程序给了我以下错误:
错误:类型的引用初始化无效
来自类型表达式的'std::_cxx11::basic_string&'
'std::pair,
std::\uuuCXX11::基本字符串>'
我知道,问题出在for_each()
函数上,我认为这是因为ask()
函数的参数不正确。
但据我所知,
std::multimap
的每个条目都表示为一个std::pair
,因此ask()
函数不应该将一个std::pair
对象作为其参数吗?std::multimap
的元素类型是std::pair
。注意const
用于std::multimap
的默认分配器是
std::allocator<std::pair<const Key, T>
其中asask()
需要参数作为对类型的引用
std::pair<std::string, std::string>
您可以直接询问,而不是猜测地图的元素类型
void ask(std::multimap<std::string, std::string>::reference entry) {
// do something...
}
void ask(std::multimap::reference条目){
//做点什么。。。
}
为这个映射类型创建一个类型别名可能是个好主意,这样您就不必重复它了
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);
}
使用myMap\u t=std::multimap;
void ask(myMap\u t::引用条目){
//做点什么。。。
}
int main(){
myMap\u t myMap;
对于(int i=0;i<5;i++){
insert(myMap_t::value_type(“key”、“value”);
}
std::for_each(myMap.begin(),myMap.end(),ask);
}
我已经试过了,但没用。它给出了完全相同的结果error@HidayetRzayev编辑:对不起,我忘了在我的函数声明中添加常量,它工作得很好。谢谢大家!@ask()方法相当长,因此我决定通过编写一个单独的函数来保持代码的整洁。
void ask(std::pair<const std::string, std::string>& entry)
{
}
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);
}