2

假设我有一些对象,例如:

std::map<int, std::vector<double> > some_map;

简单的问题:执行以下操作是否更有效

std::vector<double> vec = some_map[some_index];

或引用它

std::vector<double>& vec = some_map[some_index];

谁能简单地解释一下这里幕后通常会发生什么?

首先十分感谢!

4

3 回答 3

8

两者具有不同的语义,并且不可互换。第一个为您提供一个副本,您可以随意修改它,而无需更改地图中的任何内容。第二个为您提供对地图中数据元素的引用;任何修改都会修改地图的内容。此外,虽然可能不是问题,但请注意,如果地图在引用超出范围之前被破坏,则引用将悬空。

关于性能,这取决于向量中的内容以及您以后如何处理它;在大多数情况下,引用可能会有更好的性能,但在分析器说你必须这样做之前,你不应该担心它。(如果您确实使用了参考,请制作它const,除非您确实希望能够修改地图的内容。)

于 2013-07-29T17:09:45.787 回答
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];

thenvec直接引用some_map[some_index]并避免复制。但是,请注意,如果您稍后更改vec,则更改将反映在两者中vecsome_map[some_index]因为它们引用的是同一个对象。为了防止不需要的更改,使用 const 引用更安全:

const std::vector<double>& vec = some_map[some_index];
于 2013-07-29T17:05:00.227 回答
1

在内存使用和 cpu 周期方面,引用效率更高。您的第一行代码复制了向量,其中包括复制向量中的每个项目。在第二个中,您只是指现有的向量。不制作副本。

于 2013-07-29T17:05:34.603 回答