地图的 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&lt;std::string, std::string&gt; 的元素类型为std::pair&lt;const std::string, std::string&gt;。注意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 lambda 函数的错误

为啥在 std::for_each() 返回时调用转换运算符?

如何计算 std::for_each lambda 函数所需的类型

在 C++ 向量的每个元素上调用函数

检查字符串是否相等