假设我有一些对象,例如:
std::map<int, std::vector<double> > some_map;
简单问题:执行以下操作是否更有效
std::vector<double> vec = some_map[some_index];
或引用它
std::vector<double>& vec = some_map[some_index];
任何人都可以简单解释一下幕后通常会发生什么?
非常感谢!
答案 0 :(得分:7)
这两者具有不同的语义,并且不可互换。 第一个给你一个副本,你可以修改它 希望,不改变地图中的任何内容。第二个给出 你引用了地图中的数据元素;任何 修改修改地图的内容。而且,虽然 可能不是问题,请注意,如果地图被破坏了 在引用超出范围之前,引用将 吊着。
关于性能,它取决于向量中的内容,
以及你以后用它做什么在大多数情况下,参考将
可能有更好的表现,但你不应该担心
直到分析师说你必须这样做。 (如果你确实使用了
参考,使它const
,除非你真的想要能够
修改地图的内容。)
答案 1 :(得分:4)
创建引用更有效,但是您应该注意这两个语句在语义上是不同的,并且具有不同的行为。
如果你这样做
std::vector<double> vec = some_map[some_index];
调用std::vector
的复制构造函数将整个向量some_map[some_index]
复制到vec
。通过这种方式,您将获得一个全新的向量vec
。它们是独立的对象,对vec
的任何更改都不会影响原始地图。
如果您使用
std::vector<double>& vec = some_map[some_index];
然后vec
直接引用some_map[some_index]
并避免复制。但请注意,如果您稍后更改vec
,则更改将反映在vec
和some_map[some_index]
中,因为它们引用同一个对象。为了防止不必要的更改,使用const引用更安全:
const std::vector<double>& vec = some_map[some_index];
答案 2 :(得分:1)
在使用的内存和cpu周期方面,引用效率更高。您的第一行代码生成了向量的副本,其中包括复制向量中的每个项目。在第二个中,您只是指现有的向量。没有制作副本。