首页 > 解决方案 > 在遍历地图时使用范围变量作为函数参数

问题描述

我正在尝试遍历地图并将每一对传递给修改内容的函数。当我尝试编译以下代码时,我收到关于item范围变量声明的以下错误:

error: invalid initialization of non-const reference of type 'std::pair<std::__cxx11::basic_string<char>, std::map<std::__cxx11::basic_string<char>, int> >&' from an rvalue of type 'std::pair<std::__cxx11::basic_string<char>, std::map<std::__cxx11::basic_string<char>, int> >'
     for(std::pair<std::string, std::map<std::string, int>>& index : names)

当我尝试使用auto&声明范围变量索引时,错误从范围变量声明转移到函数调用incrementAndPrintIt(index);

#include <iostream>
#include <vector>
#include <map>

void incrementAndPrintIt(std::pair<std::string, std::map<std::string, int>>& value)
{
    for(auto& j : value.second) {
        j.second = j.second + 1;
        std::cout << "j:  " << j.second << std::endl;
    }
}

int main() {

    //initialize a map of maps
    std::map<std::string, std::map<std::string, int>> names = {{"women",{{"Rita",2}}},{"men",{{"Jack",4}}}};

    for(std::pair<std::string, std::map<std::string, int>>& index : names) {
        incrementAndPrintIt(index);
    }
    return 0;
}  

标签: c++for-loopreferencestdmap

解决方案


 for(std::pair<std::string, std::map<std::string, int>>& index : names) 

在 astd::map中,映射的键,即对中的第一个值,是一个常量值。

这应该是:

 for(std::pair<const std::string, std::map<std::string, int>>& index : names) 

incrementAndPrintIt()的参数也应调整为相同。

首先使用它很容易auto避免这整个头痛:

 for(auto& index : names) 

但这对incrementAndPrintIt()' 参数没有帮助。但是它不需要 map 的键,所以你可以简单地传递index.second给它,并在你的键盘上节省很多磨损:

#include <iostream>
#include <vector>
#include <map>

void incrementAndPrintIt(std::map<std::string, int> &value)
{
    for(auto& j : value) {
        j.second = j.second + 1;
        std::cout << "j:  " << j.second << std::endl;
    }
}

int main() {

    //initialize a map of maps
    std::map<std::string, std::map<std::string, int>> names = {{"women",{{"Rita",2}}},{"men",{{"Jack",4}}}};

    for(auto& index : names) {
        incrementAndPrintIt(index.second);
    }
    return 0;
}

您必须承认:这要简单得多,不是吗?


推荐阅读