这两个例子都有效并且做同样的事情。我只是想了解它们在优化、速度和整体方面有什么区别。哪种方法更好,为什么?提前致谢。
第一个例子:
std::map<std::vector<int>, std::vector<double>> data
printMap(&data);
...
void printMap(std::map<std::vector<int>, std::vector<double>> *p_data){
for(std::map<std::vector<int>, std::vector<double>>::iterator itr = p_data->begin(); itr != p_data->end(); ++itr){
for(auto it = itr->first.begin(); it != itr->first.end(); ++it){
std::cout << *it << std::endl;
}
for(auto it2 = itr->second.begin(); it2 != itr->second.end(); ++it2){
std::cout << *it2 << std::endl;
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二个例子:
std::map<std::vector<int>, std::vector<double>> data;
printMapRef(data);
void printMapRef(std::map<std::vector<int>,std::vector<double>> &data){
for(std::map<std::vector<int>, std::vector<double>>::iterator itr = data.begin(); itr != data.end(); ++itr){
std::vector<int> tempVecInt = (*itr).first;
std::vector<double> tempVecDouble = (*itr).second;
for (int i = 0; i < tempVecInt.size(); i++){
std::cout << tempVecInt.at(i) << " ";
}
for (int j = 0; j < tempVecDouble.size(); j++){
std::cout << tempVecDouble.at(j) << " ";
}
}
}
Run Code Online (Sandbox Code Playgroud)
明显的区别在于,第一个迭代遍历映射中的向量,而第二个创建映射中向量的副本,然后迭代这些副本。
第二个还用于.at对每个向量进行索引,它检查索引是否在范围内(如果不在范围内,则抛出异常)。
特别是如果向量很大,很容易使第二个向量明显慢于第一个向量。
大多数其他差异主要是语法上的。就我个人而言,我不太喜欢基于迭代器的循环的语法,但迭代器与索引不太可能在速度或类似方面产生任何真正的差异。
对于它的价值来说,我自己的偏好是通过 ( const) 引用传递地图并使用基于范围的for循环。我还至少考虑使用一个函数来打印每个向量的内容,因为您有两个应该基本上相同的循环。