试图更好地理解它。这两种实现有什么区别?

Ant*_*onU 0 c++ maps vector

这两个例子都有效并且做同样的事情。我只是想了解它们在优化、速度和整体方面有什么区别。哪种方法更好,为什么?提前致谢。

第一个例子:

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)

Jer*_*fin 5

明显的区别在于,第一个迭代遍历映射中的向量,而第二个创建映射中向量的副本,然后迭代这些副本。

第二个还用于.at对每个向量进行索引,它检查索引是否在范围内(如果不在范围内,则抛出异常)。

特别是如果向量很大,很容易使第二个向量明显慢于第一个向量。

大多数其他差异主要是语法上的。就我个人而言,我不太喜欢基于迭代器的循环的语法,但迭代器与索引不太可能在速度或类似方面产生任何真正的差异。

对于它的价值来说,我自己的偏好是通过 ( const) 引用传递地图并使用基于范围的for循环。我还至少考虑使用一个函数来打印每个向量的内容,因为您有两个应该基本上相同的循环。