foreach和for的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了foreach和for的区别相关的知识,希望对你有一定的参考价值。

就编码来说各有好处:for更灵活,foreach更简便

就性能来说:看图。

参考技术A 1.如果只是遍历集合或者数组,用foreach好些,快些。
2.如果对集合中的值进行修改,就要用for循环了。其实foreach的内部原理其实也是Iterator,但它不能像Iterator一样可以人为的控制,而且也不能调用iterator.remove();更不能使用下标来访问每个元素,所以不能用于增加,删除等复杂的操作。举个例子:
for(String aid:list)
if(aid.equals("aa"))
list.remove(aid); //这行会报错,不能修改list的长度


所以foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句。
参考技术B 1.如果只是遍历集合或者数组,用foreach好些,快些。
2.如果对集合中的值进行修改,就要用for循环了。其实foreach的内部原理其实也是Iterator,但它不能像Iterator一样可以人为的控制,而且也不能调用iterator.remove();更不能使用下标来访问每个元素,所以不能用于增加,删除等复杂的操作。举个例子:
for(String aid:list)
if(aid.equals("aa"))
list.remove(aid); //这行会报错,不能修改list的长度


所以foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句。
参考技术C for和foreach有本质的区别
foreach的具体过程是由目标对象控制的
所以并非集合内容更改了就不可以使用foreach
而是Array和Collection对象如此实现了它而已
你却可以完全按照自己的想法去实现这一过程

也许你可以去翻一下Gof的Visitor模式,foreach看起来就是它的简化版本
我们应该把foreach当作一种设计模式而不是简单的一个循环语句去理解

目前C#里的foreach是以IEnumerable的方式去实现,这只是保留COM的实现方式,这种方式我认为其实不太便于理解
我想如果存在一个IForEachable其成员为ForEach(..),这样可能更能让人容易明白
参考技术D 1.如果只是遍历集合或者数组,用foreach好些,快些。
2.如果对集合中的值进行修改,就要用for循环了。其实foreach的内部原理其实也是Iterator,但它不能像Iterator一样可以人为的控制,而且也不能调用iterator.remove();更不能使用下标来访问每个元素,所以不能用于增加,删除等复杂的操作。本回答被提问者采纳

for each 和 for_each 有啥区别?

【中文标题】for each 和 for_each 有啥区别?【英文标题】:What is the difference between for each and for_each?for each 和 for_each 有什么区别? 【发布时间】:2019-09-17 05:06:31 【问题描述】:

我接手了一个旧代码,需要使用 JNI 调用。在代码中看到for each( in )的用法,但是这段代码在Linux下无法编译。

好想知道for each是怎么生成的,可以使用哪些平台,Linux下编译的时候有没有?

我正在尝试理解for each 的语法,但是这个信息几乎是不可能找到的,但是有很多for_each 的用法。

在windows平台上我只用Visual Studio 2013 (v120)编译成功,v14之后的版本异常。

在Linux平台下,我使用如下命令编译,报错很多。结果如下:

g++ -I/usr/java/jdk1.8.0_191/include/ -I/usr/java/jdk1.8.0_191/include/linux/ -fPIC -shared -o ErmjJNI.so *.cpp -pthread -std=c++11

ErmjAI.cpp: In member function ‘virtual void ErmjAI::initGame(size_t, size_t, const std::vector<std::vector<int> >&, std::string, std::string)’:
ErmjAI.cpp:74:8: error: expected ‘(’ before ‘each’
    for each (size_t tile in tiles[i])
        ^
ErmjAI.cpp:74:21: error: expected primary-expression before ‘tile’
    for each (size_t tile in tiles[i])
                     ^
ErmjAI.cpp:74:37: error: ‘each’ was not declared in this scope
    for each (size_t tile in tiles[i])
                                     ^
ErmjAI.cpp:75:4: error: expected ‘;’ before ‘’ token
    
    ^
ErmjAI.cpp:3346:1: error: expected primary-expression at end of input
 

我在这个(http://www.cplusplus.com/search.do?q=for+each)网站上查询了相关的API,但是没有任何收获。

这样的代码太多了,我已经失去耐心了,下面列出几个例子。

for each (size_t tile in tiles[i])

    if (tile<=33)
    
        tNum[tile]++;
        _unseen_tiles_num[tile]--;
    
    else
    
        m_vecHua[i].push_back(tile);
    

很想知道如何在Linux下编译for each语法。 想知道for each的历史和使用平台。 我想更多地了解我应该如何理解这一点,而不是像现在这样问问题。

【问题讨论】:

使用#define each#define in :,您可能会运行它,但我担心它可能会破坏其他代码。 ;-) 一一替换,#define很危险 【参考方案1】:

for each, in 是 Microsoft 编译器中的非标准语法,即使他们也不推荐使用。我建议您更改代码以使用 C++11 ranged-based for 循环。这将得到标准的编译器的支持。

for (size_t tile : tiles[i])

    // your code

【讨论】:

【参考方案2】:
for each (size_t tile in tiles[i])

看起来不像C++,改成:

for (size_t tile : tiles[i])

您还可以read 如何在 C++ 中使用基于范围的方法。

【讨论】:

以上是关于foreach和for的区别的主要内容,如果未能解决你的问题,请参考以下文章

foreach(增强for循环)和for的区别

for循环与forEach循环的区别

for循环 switch foreach用法合区别

在C#中for循环和foreach循环有啥区别?

foreach 和 for 循环的区别

for、while、foreach性能比较