【问题标题】:std::for_each() for a map gives invalid initialization error地图的 std::for_each() 给出无效的初始化错误
【发布时间】: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() 方法很长,所以我决定编写一个单独的函数来保持代码更简洁。

标签: c++ c++11 stl


【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      相关资源
      最近更新 更多