Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这是STL容器基于范围的循环中迭代器语法之间的区别 虽然我对爪哇的C和OOP知识不多,但我开始深入研究C++及其特殊性。我已经阅读了C++的所有基本内容,但我仍然困惑于C++ 11的特定事物,语法和性能都很好。容器迭代器就是其中之一,我发现它是以各种语法形式实现的(例如)_C++_C++11_Stl_Iterator - Fatal编程技术网

什么';这是STL容器基于范围的循环中迭代器语法之间的区别 虽然我对爪哇的C和OOP知识不多,但我开始深入研究C++及其特殊性。我已经阅读了C++的所有基本内容,但我仍然困惑于C++ 11的特定事物,语法和性能都很好。容器迭代器就是其中之一,我发现它是以各种语法形式实现的(例如)

什么';这是STL容器基于范围的循环中迭代器语法之间的区别 虽然我对爪哇的C和OOP知识不多,但我开始深入研究C++及其特殊性。我已经阅读了C++的所有基本内容,但我仍然困惑于C++ 11的特定事物,语法和性能都很好。容器迭代器就是其中之一,我发现它是以各种语法形式实现的(例如),c++,c++11,stl,iterator,C++,C++11,Stl,Iterator,我想知道其中哪些是完全等效的,为什么要使用一个或另一个,以及在性能方面有什么影响 a)autovs显式声明: 是否始终支持自动?除了代码可读性问题,为什么程序员更喜欢显式声明 list<int>::const_iterator i = myIntList.begin(); /* Option a1 */ auto i = myIntList.begin(); /* Option a2 */ for(auto i : myIntL

我想知道其中哪些是完全等效的,为什么要使用一个或另一个,以及在性能方面有什么影响

a)
auto
vs显式声明:
是否始终支持
自动
?除了代码可读性问题,为什么程序员更喜欢显式声明

list<int>::const_iterator i = myIntList.begin();    /* Option a1 */
auto i = myIntList.begin();                         /* Option a2 */

for(auto i : myIntList) { ... }                     /* Option a3 */
for(int i : myIntList) { ... }                      /* Option a4 */
也许它们中的大多数都是相同的,也许选择一个选项或另一个选项只对给定的循环体有意义,但我想知道,允许使用这么多可能的方法来编程相同的行为的目的是什么

是否始终支持自动模式

仅从C++11开始,基于范围的循环也是如此,所以如果您可以依赖一个循环,那么应该允许您依赖另一个循环


除了代码可读性问题,为什么程序员更喜欢显式声明

list<int>::const_iterator i = myIntList.begin();    /* Option a1 */
auto i = myIntList.begin();                         /* Option a2 */

for(auto i : myIntList) { ... }                     /* Option a3 */
for(int i : myIntList) { ... }                      /* Option a4 */
您可以使用显式类型执行到另一个类型的隐式转换


紧凑形式与扩展循环形式

显式使用迭代器(您称之为“扩展”)比使用基于范围的循环(您称之为“紧凑”)可以做得更多。但是,如果您只想迭代元素的范围一次,那么基于范围的循环具有更简单的语法。这就是它被引入语言的原因


为什么/何时希望在循环体中有一个引用[…]

/* Constant/non-constant: */
for(list<int>iterator i = l.begin(); ...) { ... }   /* Option c1 */
for(list<int>const_iterator i = l.begin(); ...) { } /* Option c2 */

for(const int& i : list) { ... }                    /* Option c3 */
for(int& i : list) { ... }                          /* Option c4 */

/* Access by reference/by value: */
for(auto&& i : list) { ... }                        /* Option c5 */
for(auto i : list) { ... }                          /* Option c6 */
当无法复制或希望避免复制迭代元素时

为什么/何时希望在循环体中有一个[…]a常量

/* Constant/non-constant: */
for(list<int>iterator i = l.begin(); ...) { ... }   /* Option c1 */
for(list<int>const_iterator i = l.begin(); ...) { } /* Option c2 */

for(const int& i : list) { ... }                    /* Option c3 */
for(int& i : list) { ... }                          /* Option c4 */

/* Access by reference/by value: */
for(auto&& i : list) { ... }                        /* Option c5 */
for(auto i : list) { ... }                          /* Option c6 */
当一个人只有对范围的常量访问权限,或者想要表示他们不打算修改对象时


循环退出条件

如果结束指针在循环中无效,则只有
d2
是正确的

如果结束迭代器是不变的,那么由于将函数调用带出循环,
d1
的效率可能会稍高一些

如果编译器可以看到
T::end()
的定义,那么它可以通过将
d2
转换为
d1
进行优化

在任何情况下,单个函数调用的开销通常可以忽略不计,除非循环体本身微不足道


我想知道允许这么多可能的方式来编程相同的行为的目的是什么

的确,所有循环结构都可以使用
goto
实现

<>为什么C++会允许其他循环结构?代码>用于,
,而
等的引入使程序更容易理解,更具可读性。好吧,既然的更容易理解,那为什么不摆脱转到?这是因为
for
不能做
goto
所能做的一切<代码>转到更一般

同样的道理也适用于这个新的基于范围的循环。它比更一般的循环结构更容易推理,因此是一个有用的补充。但是,一般结构仍然有其使用的位置,这在基于范围的循环中是不可能的。此外,删除结构的常规
会破坏语言的向后兼容性,这是不可取的

是否始终支持自动模式

仅从C++11开始,基于范围的循环也是如此,所以如果您可以依赖一个循环,那么应该允许您依赖另一个循环


除了代码可读性问题,为什么程序员更喜欢显式声明

list<int>::const_iterator i = myIntList.begin();    /* Option a1 */
auto i = myIntList.begin();                         /* Option a2 */

for(auto i : myIntList) { ... }                     /* Option a3 */
for(int i : myIntList) { ... }                      /* Option a4 */
您可以使用显式类型执行到另一个类型的隐式转换


紧凑形式与扩展循环形式

显式使用迭代器(您称之为“扩展”)比使用基于范围的循环(您称之为“紧凑”)可以做得更多。但是,如果您只想迭代元素的范围一次,那么基于范围的循环具有更简单的语法。这就是它被引入语言的原因


为什么/何时希望在循环体中有一个引用[…]

/* Constant/non-constant: */
for(list<int>iterator i = l.begin(); ...) { ... }   /* Option c1 */
for(list<int>const_iterator i = l.begin(); ...) { } /* Option c2 */

for(const int& i : list) { ... }                    /* Option c3 */
for(int& i : list) { ... }                          /* Option c4 */

/* Access by reference/by value: */
for(auto&& i : list) { ... }                        /* Option c5 */
for(auto i : list) { ... }                          /* Option c6 */
当无法复制或希望避免复制迭代元素时

为什么/何时希望在循环体中有一个[…]a常量

/* Constant/non-constant: */
for(list<int>iterator i = l.begin(); ...) { ... }   /* Option c1 */
for(list<int>const_iterator i = l.begin(); ...) { } /* Option c2 */

for(const int& i : list) { ... }                    /* Option c3 */
for(int& i : list) { ... }                          /* Option c4 */

/* Access by reference/by value: */
for(auto&& i : list) { ... }                        /* Option c5 */
for(auto i : list) { ... }                          /* Option c6 */
当一个人只有对范围的常量访问权限,或者想要表示他们不打算修改对象时


循环退出条件

如果结束指针在循环中无效,则只有
d2
是正确的

如果结束迭代器是不变的,那么由于将函数调用带出循环,
d1
的效率可能会稍高一些

如果编译器可以看到
T::end()
的定义,那么它可以通过将
d2
转换为
d1
进行优化

在任何情况下,单个函数调用的开销通常可以忽略不计,除非循环体本身微不足道


我想知道允许这么多可能的方式来编程相同的行为的目的是什么

的确,所有循环结构都可以使用
goto
实现

<>为什么C++会允许其他循环结构?代码>用于
,而
等的引入使程序更容易理解,更具可读性。好吧,既然的更容易理解,那为什么不摆脱转到?这是因为
for
不能做
goto
所能做的一切<代码>转到更一般

同样的道理也适用于这个新的基于范围的循环。它比更一般的循环结构更容易推理,因此是一个有用的添加