在遍历地图的地图时使用范围变量作为函数参数
Using for range variable as function argument while looping through map of maps
我正在尝试遍历地图的地图并将每一对传递给修改内容的函数。当我尝试编译以下代码时,出现以下关于 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;
}
for(std::pair<std::string, std::map<std::string, int>>& index : names)
在 std::map
中,映射的键,即对中的第一个值,是一个常量值。
这应该是:
for(std::pair<const std::string, std::map<std::string, int>>& index : names)
incrementAndPrintIt()
的参数也要调成一样
使用 auto
很容易从一开始就避免整个头痛:
for(auto& index : names)
但这对 incrementAndPrintIt()
的参数没有帮助。但是它不需要地图的键,所以你可以简单地将 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;
}
您必须承认:这要简单得多,不是吗?
我正在尝试遍历地图的地图并将每一对传递给修改内容的函数。当我尝试编译以下代码时,出现以下关于 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;
}
for(std::pair<std::string, std::map<std::string, int>>& index : names)
在 std::map
中,映射的键,即对中的第一个值,是一个常量值。
这应该是:
for(std::pair<const std::string, std::map<std::string, int>>& index : names)
incrementAndPrintIt()
的参数也要调成一样
使用 auto
很容易从一开始就避免整个头痛:
for(auto& index : names)
但这对 incrementAndPrintIt()
的参数没有帮助。但是它不需要地图的键,所以你可以简单地将 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;
}
您必须承认:这要简单得多,不是吗?