假设x是a vector<vector<int>>,我想计算的每个元素的大小之和x。这是一个愚蠢的示例,但是我想问一下,当的元素的大小x足够大时,上述方法是否等效于性能。
// The first method:
int sum = 0;
for (vector<int> it : x)
sum += it.size();
// The second method:
int sum = 0;
for (vector<int>& it : x)
sum += it.size();
Run Code Online (Sandbox Code Playgroud)
我认为第二个for更快,因为它使用了&,因此x不会将的每个元素的值复制到it。我是对的还是两种方法执行的都一样?
是的,没错。当使用auto以下代码时,意外地将其复制到有范围的for循环变量中是一个特别常见的问题:
for (auto it : x)
sum += it.size();
Run Code Online (Sandbox Code Playgroud)
这是低效的,因为即使使用auto来自动设置类型,并且即使迭代是在vector&s 集合上,也it最终拥有type vector。(解决方案将会auto&,甚至更好auto const&。)
顺便说一句,这里的主要性能接收器不只是将元素从内部复制x到您的临时文件it,还包括分配和释放的使用的内存it。