地图的 std::for_each() 给出无效的初始化错误
Posted
技术标签:
【中文标题】地图的 std::for_each() 给出无效的初始化错误【英文标题】:std::for_each() for a map gives invalid initialization error 【发布时间】:2019-01-16 05:03:03 【问题描述】:我对 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::__cxx11::basic_string >'
我知道,问题出在for_each()
函数上,我认为这是因为ask()
函数的参数不正确。
但据我所知,std::multimap
的每个条目都表示为std::pair
,所以ask()
函数不应该将std::pair
对象作为其参数吗?
【问题讨论】:
@JeJo ask() 方法很长,所以我决定编写一个单独的函数来保持代码更简洁。 【参考方案1】:std::multimap<std::string, std::string>
的元素类型为std::pair<const std::string, std::string>
。注意const
【讨论】:
【参考方案2】: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)
【讨论】:
我试过了,但没有用。它给出了完全相同的错误 @HidayetRzayev works here 编辑:对不起,我也忘了在我的函数声明中添加 const,它工作得很好。谢谢!【参考方案3】:与其猜测地图的元素类型,可以直接问。
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);
【讨论】:
以上是关于地图的 std::for_each() 给出无效的初始化错误的主要内容,如果未能解决你的问题,请参考以下文章
std::for_each 和 std::vector 析构函数调用
为啥在 std::for_each() 返回时调用转换运算符?