jquery 案例网站,自己做百度网站,软件开发详细设计文档,什么是网站可信认证转自#xff1a;foreach for each for_each引发的探讨#xff1a;c世界中的循环语句_w_419675647的博客-CSDN博客
一 背景#xff1a;
代码中看到 for each#xff0c;注意#xff0c;两个单词中间没有下划线#xff0c;有同事问这个是不是和 for_each一样#xff1f;…转自foreach for each for_each引发的探讨c世界中的循环语句_w_419675647的博客-CSDN博客
一 背景
代码中看到 for each注意两个单词中间没有下划线有同事问这个是不是和 for_each一样和foreach呢我回答应该一样但是内心很不安尤其是作为一个c的多年用户。
二 资料收集整理
1 首先来看看我们最熟悉的 for_each。
他的全名是 std::for_each来源c的stl。头文件algorithm. 当时是个模板函数了 template class InputIterator, class Function Function for_each (InputIterator first, InputIterator last, Function fn); 标准库中的例子
// for_each example
#include iostream // std::cout
#include algorithm // std::for_each
#include vector // std::vectorvoid myfunction (int i) { // function:std::cout i;
}struct myclass { // function object type:void operator() (int i) {std::cout i;}
} myobject;int main () {std::vectorint myvector;myvector.push_back(10);myvector.push_back(20);myvector.push_back(30);std::cout myvector contains:;for_each (myvector.begin(), myvector.end(), myfunction);std::cout \n;// or:std::cout myvector contains:;for_each (myvector.begin(), myvector.end(), myobject);std::cout \n;return 0;
} 2 再来看看foreach。
搜索引擎里可以搜到很多相关标题但是点进去后会发现几乎都是在讲 for_each。仅有的几篇异同点其实是个错误的宏定义。 后来试着在QT的帮助文档里找了下果然找到了。 他是 - Global Qt Declarations foreach(variable, container) This macro is used to implement Qt’s foreach loop. The variable parameter is a variable name or variable definition; the container parameter is a Qt container whose value type corresponds to the type of the variable. See The foreach Keyword for details. Note: Since Qt 5.7, the use of this macro is discouraged. It will be removed in a future version of Qt. Please use C11 range-for, possibly with qAsConst(), as needed. See also qAsConst(). 大致的翻译从Qt 5.7开始不建议使用此宏。 它将在Qt的将来版本中删除。 请根据需要使用C 11 range-for可能与qAsConst一起使用。 另请参见qAsConst。 是的不再建议使用。
3 最后找找for each。
真难找好像没有这个语法但是代码里确实有使用代码里的关键字是两个分开的单词也无法到到对应的定义文件。
换到bing引擎终于还是找到了。
《https://docs.microsoft.com/en-us/cpp/dotnet/for-each-in?viewvs-2019》
原来是微软自己的定义。
Iterates through an array or collection. This non-standard keyword is available in both C/CLI and native C projects. However, its use is not recommended. Consider using a standard Range-based for Statement (C) instead.
翻译遍历数组或集合。 此非标准关键字在C / CLI和本机C 项目中均可用。 **但是不建议使用它。** 考虑改为使用标准的基于范围的语句C 。
是的不建议使用了。三 聊聊c 世界的循环语句
1 对容器中的每一个元素都调用函数的方法有以下
第一种基于迭代器
for (std::vectorint::iterator it ve.begin(); it ve.end(); it)f(*it);
for (std::vectorint::const_iterator it ve.cbegin(); it ve.cend(); it)f(*it);
for (std::vectorint::iterator it ve.begin(); it ! ve.end(); it)f(*it);
for (std::vectorint::const_iterator it ve.cbegin(); it ! ve.cend(); it)f(*it);第二种基于下标
for (int i 0; i ! ve.size(); i)f(ve[i]);
for (int i 0; i ve.size(); i)f(ve[i]);
for (std::size_t i 0; i ! ve.size(); i)f(ve[i]);
for (std::size_t i 0; i ve.size(); i)f(ve[i]);
for (std::vectorint::size_type i 0; i ! ve.size(); i)f(ve[i]);
for (std::vectorint::size_type i 0; i ve.size(); i)f(ve[i]);第三种stl模板函数
std::for_each(ve.begin(), ve.end(), f);
std::for_each(ve.cbegin(), ve.cend(), f);
std::for_each(std::begin(ve), std::end(ve), f);
std::for_each(std::cbegin(ve), std::cend(ve), f); // C14第四种基于范围的循环
for (auto val : ve)f(val);
for (auto val : ve)f(val);
for (const auto val : ve)f(val);2 分析
第一种方法书写太复杂并不是所有容器的迭代器都支持小于操作容易误写成 it ve.end()第二种方法调用 ve.size()可能有效率的问题 调用 ve[i]可能有效率的问题 并不是所有的容器都支持下标操作下标的标准规范是无符号的数所以使用int 是错误的标准并未说明下标具体用何种类型说明所以使用std::size_t可能有可移植性的问题使用 std::vector::size_type正确但书写太复杂了容易误写为 i ve.size()第三种方法相比前两种不容易出错相比前两种书写也简单多了如果在函数调用处写函数的话还是比较复杂第四种方法相比前三种不容易出错相比前三种书写更简单了直接在函数调用处写函数也很简单需要 C11 或之后