mysql matlab for循环嵌套循环语句吗_C++: for_each 和 基于范围的for循环

本文介绍了C++中的两种高级for循环形式:for_each函数模板和基于范围的for循环。for_each是函数模板,适用于对容器内的元素进行处理,通过迭代器定义区间并传入函数对象。基于范围的for循环则是C++11引入的简洁语法,直接遍历容器或数组中的元素。文中通过实例展示了如何使用这两种循环,并对比了它们与MATLAB的arrayfun函数和Python的for循环的相似之处。
摘要由CSDN通过智能技术生成

普通的for循环

for_each函数模板

基于范围的for循环

普通用的像:

for(int i = 0; i 

这种的for循环就不说了, 下面主要说一下后两个,做个笔记。

以后用for循环可以考虑下使用后两种方法!

9f99d13dde5a359d8186ce6b33417bd3.png

对于C++中的for_each:

首先它实际上是一个函数模板,包含在这个头文件中,它的原型如下:

template 

Function for_each (InputIterator first, InputIterator last, Function fn);

for_each 的前两个参数是迭代器,用来定义容器的一个区间,第三个参数是一个函数对象,直接把你定义的一个函数的函数名放到第三个参数的位置上也行。(那个迭代器可以简单地理解为一个指针)

这个fn只能有一个参数,然后这个for_each就是把从 first 到 last 这个区间内的所有数据挨个带入到函数 fn 中进行处理计算,fn的形参类型需要和容器中数据的类型一致。如果要修改容器中该范围内的数据,需要把 fn 的形参写成某某类型的引用。

举例来说明

#include 

#include 

#include  // using for_each

void modf1(int&);

void show(const int&);

int main(){

//1. 用for_each来 对一个容器进行修改

std::vector test1;

//   向test1容器中添加4个数

for (int i = 0; i 

test1.push_back(i + 1);

std::cout <

//用for_each 修改 和 展示 test1容器中的内容

std::cout <

for_each(test1.begin(), test1.end(), show); //展示原始的数据

for_each(test1.begin(), test1.end(), modf1);//修改原始的数据

std::cout <

for_each(test1.begin(), test1.end(), show); //展示修改后的数据

std::cout <

std::cin.get();

std::cin.get();

return 0;

}

void modf1(int& r){

r++;

}

void show(const int& r){

std::cout <

}

运行结果:

3aeb42babff8c0267f6ec56f45958ff6.png

还有再回忆下matlab中的arrayfun函数,可以看一下这篇推文:避免无用的循环——fun系列的另外三个函数

B = arrayfun(func,A)

感觉MATLAB中的这个函数也有点像这个for_each。arrayfun是直接把A中的所有元素都给func函数,而不要设一个区间。

9f99d13dde5a359d8186ce6b33417bd3.png

对于C++中的 基于范围的for循环(C++11中才有),为用于STL设计的。它的用法如下:

for (type x : container)

{

....

}

type是变量x的类型,而且type必须和container容器中的元素类型一致!然后循环体就可以使用指定的变量 x 来依次访问容器container中的每个元素。还有就是这个container可以是容器,也可以是普通数组。

如果需要修改container中的元素,可以把这个 x 的类型变成type的引用,即type & 。

其实这个挺像Python中的for循环:

container = [1, 2, 3, 4]

for i in container:

....body....

下面举例说明

#include 

#include 

#include  // using for_each

void modf1(int&);

void show(const int&);

int main(){

//用一个普通数组作为容器

int test[4] = { 1, 2, 3, 4, };

std::cout <

std::cout <

for (int& x : test)

show(x);

//在这个循环中来修改test容器的元素值

for (int& x : test)

modf1(x);   //这个modf1的形参也必须是引用,不然没法修改test中的元素

std::cout <

for (int& x : test)

show(x);

std::cout <

//用vector作为容器

std::vector test1;

for (int i = 0; i 

test1.push_back(i + 5);

std::cout <

std::cout <

for (int& x : test1)

show(x);

//在这个循环中来修改test1容器的元素值

for (int& x : test1)

modf1(x);   //这个modf1的形参也必须是引用,不然没法修改test中的元素

std::cout <

for (int& x : test1)

show(x);

std::cin.get();

std::cin.get();

return 0;

}

void modf1(int& r){

r++;

}

void show(const int& r){

std::cout <

}

结果:

40e74987c4082aed4e9cdf36e44a1b13.png

8c2f64e3b834149cd0ea15427d23ddf7.png

bfb224d4f9be199a52b3dfb70511e147.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值