C++11新特性:基于范围的循环(foreach) 与 Qt foreach(**)

目录

C++11新特性:基于范围的循环(foreach)


c++中的那些foreach循环

-------------------------------------------------------------------

要点:

在进行数组遍历时,有时无法指明遍历的边界。即:当前场景下,单次运行时,边界值是确定的;但是,换另外一个场景下,再次运行时,边界值和第一次却是不同的;

比如:遍历这个目录下的文件个数,遍历另外一个目录下的文件个数。

假如预先设定了边界值,那么,程序编写就会变得庞大了?

C++11中引入了 foreach 循环的语言特性(自动确定循环范围),使用这个特性能够非常方便快捷的对数组(集合)中的元素进行遍历,而不必再关心和计算数组(集合)的界限。

foreach:

在 C++ 11之后,是关键字;

在 Qt中,是宏?

======================================

C++中简单实现foreach循环

看别人用Qt写的程序时,偶然发现虽然程序中用到了foreach。foreach本来不是C++的关键字( C++ 11之后,是关键字?),但Qt是如何实现的呢?查看Qt的文档,里面说是用preprocesser(预处理)实现的。研究了一下,原来是宏定义。

foreach宏的实质就是在宏中定义循环申明部分,而不包括循环体。在使用的时候,紧接着写循环体就行了。下面用std::vector<std::string>写了一个简单的示例。
————————————————
版权声明:本文为CSDN博主「边城狂人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jamesfancy/article/details/2346551

参考:Qt 官方手册

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.

If you're worried about namespace pollution, you can disable this macro by adding the following line to your .pro file:

  CONFIG += no_keywords

Note: Since Qt 5.7, the use of this macro is discouraged. It will be removed in a future version of Qt. Please use C++11 range-for, possibly with qAsConst(), as needed.

C++11新特性:基于范围的循环(foreach)

在C++中如何遍历数组(集合)中的每一个元素?对于这个问题,相信你第一反应想到的是 for 循环。

    #include <iostream>
    #include <set>
     
    using namespace std;
     
    void main()
    {
        int a[] = {1,2,3,4,5};
        for (int i = 0; i < sizeof(a) / sizeof(*a); i++)
        {
            cout << a[i] << endl;
        }
     
        cout << endl;
     
        //set<int> v = {4,3,2,1};
        // 
        set<int> v = { 0,1,2,3,4,5};
        for (auto it = v.begin(); it != v.end(); it++)
        {
            cout << *it << endl;
        }
     
        cin.get();
    }

在上面的示例中,通过 for 循环遍历数组(集合)中的每一个元素,并打印其值。这对于熟悉 C++ 的程序员来说是非常容易的一件事;不过,无论是遍历基本类型数组还是遍历集合类型对象,都需要指明循环的界限否则就可能产生越界错误

那么,是否可以让 for 循环自动确定循环范围呢?

C++11中引入了 foreach 循环的语言特性(自动确定循环范围),使用这个特性能够非常方便快捷的对数组(集合)中的元素进行遍历,而不必再关心和计算数组(集合)的界限。

#include <iostream>
#include <set>
 
using namespace std;
 
void main()
{
    int a[] = {1,2,3,4,5};
    for (auto i : a)
    {
        cout << i << endl;
    }
 
    cout << endl;
 
    set<int> v = {4,3,2,1,0,8,5};
    for (auto i : v) //从小到大进行排序,然后才输出,并且里面没有重复的元素,如果有重复的元素,则会剔除
    {
        cout << i << endl;
    }
 
    cin.get();
}

上面的示例通过一个基于范围的 for 循环遍历数组和集合;

for 循环后的括号由冒号 “:” 分为两个部分:

第一个部分用于表示循环的迭代变量,即当前变量的值;第二个部分用于表示被访问的(数组)集合。

另外,第一个部分中的迭代变量 i 使用 auto关键字进行声明,这意味着由编译器自动确认 i 的具体类型;而 i 的具体类型完全取决于第二个部分的 a 和 v

当然,在实际开发时,也可以不使用关键字 auto具体指明迭代变量的数据类型

示例:

#include <iostream>
#include <set>
 
using namespace std;
 
void main()
{
    int a[] = {1,2,3,4,5};
    for (int& i : a)
    {
        i *= 2;
    }
 
    for (int i : a)
    {
        cout << i << endl;
    }
 
    cin.get();
}

上面示例中第一个 for 循环的迭代变量采用了引用的形式;因此,当迭代变量在循环中被改变时,这个改变将反映到具体的数组(集合)元素。

基于范围的 for 循环依然支持 continue 和 break;

使用 continue 结束当前循环,并立即进入下一次循环;使用 break 跳出整个 for 循环。

注意:如果数组(集合)的大小(范围)在编译期间不能确定,那么不能够使用基于范围的 for 循环。

#include <iostream>
#include <set>
 
using namespace std;
 
void func(int a[3])
{
    for (auto i : a)
    {
        cout << i << endl;
    }
}
 
void main()
{
    int a[] = {1,2,3,4};
 
    func(a);
 
    cin.get();
}

————————————————
版权声明:本文为CSDN博主「repinkply」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42136255/article/details/102468959

c++中的那些foreach循环

  https://blog.csdn.net/xiong_min/article/details/87859214

遍历map映射容器 三种方式
map<int, string> m;
 // 1
for (    auto &v : m)  
     {
         cout<<v.first<<" "<<v.second<<endl;
    }

 // 2 lamda表达式
 for_each(m.begin(),m.end(),[](map<int,string>::reference a){
         cout<<a.first<<" "<<a.second<<endl;
     });

// 3 for_each
 void fun(map<int,string>::reference a)  //不要少了reference,不然会报错。
{
         cout<<a.first<<" "<<a.second<<endl;
}
for_each(m.begin(),m.end(),fun);

还有一种宏定义的方法实现foreach循环:

//定义
#define foreach(container,it) \
    for(typeof((container).begin()) it = (container).begin();it!=(container).end();++it)
//输出
foreach(m,it)
    {
        cout<<it->first<<","<<it->second<<endl;
    }

for_each 函数:
http://www.cplusplus.com/reference/algorithm/for_each/?kw=for_each
https://www.cnblogs.com/zhangkele/p/9373063.html
https://www.cnblogs.com/nzbbody/p/3409189.html
 

c++11 for 循环新特性:
https://www.cnblogs.com/jiayayao/p/6138974.html
https://www.cnblogs.com/DSYR/p/9151975.html
 

宏定义实现foreach 循环:
https://blog.csdn.net/imxiangzi/article/details/49952763
https://www.cnblogs.com/DSYR/p/9151975.html

hint:这里所指的foreach 循环是指如下形式:

for (type x : arr) {
    // x依次遍历arr中的每一个数
}

补充

在DevC++使用C++11版本:
https://blog.csdn.net/qiqi123i/article/details/53150837
https://blog.csdn.net/qq_17715159/article/details/77371191

C++ 版本:
https://blog.csdn.net/ftell/article/details/79312007

C++11版本新特性:
https://www.cnblogs.com/special23/p/5083450.html
————————————————
版权声明:本文为CSDN博主「Mir_小熊同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiong_min/article/details/87859214

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值