假设我有一些对象,例如:
std::map<int, std::vector<double> > some_map;
简单的问题:执行以下操作是否更有效
std::vector<double> vec = some_map[some_index];
或引用它
std::vector<double>& vec = some_map[some_index];
谁能简单地解释一下这里幕后通常会发生什么?
首先十分感谢!
两者具有不同的语义,并且不可互换。第一个为您提供一个副本,您可以随意修改它,而无需更改地图中的任何内容。第二个为您提供对地图中数据元素的引用;任何修改都会修改地图的内容。此外,虽然可能不是问题,但请注意,如果地图在引用超出范围之前被破坏,则引用将悬空。
关于性能,这取决于向量中的内容以及您以后如何处理它;在大多数情况下,引用可能会有更好的性能,但在分析器说你必须这样做之前,你不应该担心它。(如果您确实使用了参考,请制作它const
,除非您确实希望能够修改地图的内容。)
创建引用效率更高,但您应该注意,这两个语句在语义上不同,并且具有不同的行为。
如果你这样做
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];
thenvec
直接引用some_map[some_index]
并避免复制。但是,请注意,如果您稍后更改vec
,则更改将反映在两者中vec
,some_map[some_index]
因为它们引用的是同一个对象。为了防止不需要的更改,使用 const 引用更安全:
const std::vector<double>& vec = some_map[some_index];
在内存使用和 cpu 周期方面,引用效率更高。您的第一行代码复制了向量,其中包括复制向量中的每个项目。在第二个中,您只是指现有的向量。不制作副本。