2013-08-19 14 views
7

this的启发。玩弄参数

假设我们有一个非空std::vector<T> v; 是有

for (int i = v.size() - 1; i >= 0; i--) { 
///Stuff. 
} 

之间的任何差别:

for (int i = v.size(); i--;) { 
///Stuff. 
} 

我的意思是,我不会做,对于可读性的缘故,但谁知道,这可能是在生活中有用的...

Here只是一个测试,看看它们是等价的)

编辑:的点被具有i作为索引向后访问向量(在具有索引为优选具有迭代器的情况下)

编辑2:出于好奇:他们最终具有略有不同的汇编代码。见thisthis

+0

1)基准它看到没有区别。2)比较生成的程序集并验证没有什么实质性差异。 –

+1

@JonathonReinhart因为在循环条目之前检查条件,所以不需要删除'-1'。 – dasblinkenlight

+0

你知道你可以使用reverse_iterators来做这件事吗? –

回答

2

这是一种合法的方式,但在可读性方面使用i--作为for循环中的条件是一个糟糕的主意。

for循环意味着由3部分组成 - 为什么让人们生活更难?

人谁看了你的代码会很高兴,如果你坚持传统for循环:

for (int i = v.size() - 1; i >= 0; i--) { 
    ///Stuff. 
} 
4

人们可以把一个for循环

for (<decl-init> ; <condition> ; <post-adjust>) <body> 

作为大致相当于这个while循环:

<decl-init>; 
while (condition) { 
    <body>; 
    <post-adjust>; 
} 

The for与上面重写的最大区别在于<decl-init>块中声明的变量范围,但这对于下面的分析并不重要。

重写两个循环的循环while给你这样的:

int i = v.size() - 1; 
while (i >= 0) { 
    <body>; 
    i--; 
} 

int i = v.size(); 
while (i--) { 
    <body>; 
} 

正如你所看到的,唯一的区别是i在进入迭代之前递减,并该条件开始于i比第一个循环大1。这两个调整“相互抵消”,从技术角度来看,您的循环等同。然而,美学是一个不同的事情:副作用的条件比“纯”的条件更难理解,所以第一个循环更具可读性。