网站漂浮图片,常州市金坛区网站建设,公司专业做网站,外贸做网站建设哪家好一般情况下不要使用std::endl#xff0c;尤其是在循环中#xff0c;因为可能一开始你只是想要打印一个换行符#xff0c;但是endl做的更多#xff0c;其还会刷新缓冲区#xff0c;这会额外花费很多时间#xff0c;相反#xff0c;只需要使用“\n… 一般情况下不要使用std::endl尤其是在循环中因为可能一开始你只是想要打印一个换行符但是endl做的更多其还会刷新缓冲区这会额外花费很多时间相反只需要使用“\n就可以做的更好例如下面这个程序例子。
#include iostreamvoid print_Number(int start,int end)
{for(auto istart;i!end;i){std::couti\n;}
}int main()
{print_Number(10,15);
}当基于范围的for循环能更好的表达意图的时候却使用索引的for循环
#include iostream
#include vectorvoid know_your_algorithms()
{const std::vectorint data{-1,-3,-5,8,15,-1};std::size_t first_pos_idx;for(std::size_t i0;idata.size();i){if(data[i]0){first_pos_idxi;break;}}std::coutdata[first_pos_idx]\n;
}
int main()
{know_your_algorithms();
}但是在这里我们可以寻找是否已经有算法可以满足我们需要做到的事情例如下面的例子
#include iostream
#include vector
#include algorithmvoid know_your_algorithms()
{const std::vectorint data{-1,-3,-5,8,15,-1};const auto is_positive[] (const auto x){return x0;};auto first_pos_itstd::find_if(data.begin(),data.end(),is_positive);if(first_pos_it!data.end()){std::cout*first_pos_it\n;}
}
int main()
{know_your_algorithms();
}其中这里的
const auto is_positive[](const auto x) {return x0;};是C语言中的lambda表达式其解释为
const auto is_positive [](const auto x) { return x 0; };
// ▲ ▲ ▲ ▲ ▲ ▲
// | | | | | |
// 常量 自动类型 Lambda 参数类型 参数 函数体
// | 推导 起始符 推导 引用
[](const auto x) { return x 0; } Lambda表达式简介
[捕获变量] (参数列表) 可选限定符-返回类型{//函数代码
}
#include iostreamint main()
{int x7;float y3.0;auto p[x,y] (int a,int b)-float{return x*ya*b;};std::coutp(10,20)\n;
}下面我们直接将lambda表达式作为实际参数传入
#include iostream
#include vector
#include algorithmint main()
{std::vectorfloat numbers{1.1,2.0,3.5,-1.4,29.2,12.1,33,6,0};sort(numbers.begin(),numbers.end(),[](float a,float b){return ab;});for(auto v:numbers) std::coutv ;
}lambda表达式实际上是函数对象的一种快捷定义方式如果我们用结构体来表示其为
#include iostream
#include vector
#include algorithmint main()
{int x7;float y3.0;struct{int x;float y;float operator()(int a,int b)const{return x*ya*b;}}p{x,y};std::coutp(10,20);
}在这里我们虽然改变了y的值但是这两个函数的输出是一模一样的
#include iostream
#include vector
#include algorithmint main()
{int x7;double y2.3;auto p[x,y](int a,int b)-float{return x*ya*b;};std::coutp(10,20)\n;y1.5;std::coutp(10,20)\n;}原因就是因为lambda函数对象中的对应成员变量只是在初始化时复制了y的值所以再次使用同样的参数调用函数对象时结果不会发生变化但是如果我们在引用的前面加上引用运算符则表示其为按引用捕获
#include iostream
#include vector
#include algorithmint main()
{int x7;double y2.3;auto p[x,y](int a,int b)-float{return x*ya*b;};std::coutp(10,20)\n;y1.5;std::coutp(10,20)\n;}因此其输出的结果为下面另外lambda所对应的函数调用运算符默认是const函数也就是说函数内部不能修改按值捕获的成员变量但是可以通过加上mutable修饰符这样捕获的成员函数都是可以修改的了。默认捕获方式
//默认按值捕获
[]
//默认按引用捕获
[]
#include iostreamint main()
{int x7;float y3.0;float z-1;auto p[](int a,int b)-float{return x*y*za*b;};y2;std::coutp(10,20)\n;
}这个就是按引用捕获因此其y发生变化的时候下面的输出会有变化。
#include iostreamint main()
{int x7;float y3.0;float z-1;auto p[,y](int a,int b)-float{return x*y*za*b;};y2;std::coutp(10,20)\n;
}