c++开发EOS基础指南:迭代器和λ表达式

  

让我们来谈谈迭代器,它是一个非常有用的工具,在整个EOS代码库中大量使用。如果您来自JavaScript背景,您可能已经熟悉迭代器,就像它们用于循环一样。迭代器的关键概念是提供一种更好的方法来遍历项集合。额外的好处是您可以为任何自定义类实现迭代器接口,使迭代器成为遍历数据的通用方法。

  
 <代码>//https://repl.it/@MrToph CPPBasics-Iterators
  # include & lt; iostream>
  # include & lt; vector>
  
  使用名称空间性病;
  
  int main ()
  {
  vectorv {2、3、5、8};//迭代的旧方式
  for (int i=0;我& lt;v.size ();我+ +)
  {
  cout & lt; & lt;v[我]& lt; & lt;“\ n”;
  }//使用迭代器//开始()返回一个迭代器,指向向量的开始//结束()指出,最后,可以比较使用!=操作符//迭代器使用+运营商由于增加了操作符重载
  (vector 
  

在现代c++中,迭代器是迭代元素集合(向量,列表,映射)的首选方式。另外,汽车关键字可以避免输入词的类型,但可能会导致代码性能降低。

  

λ表达式

  

使用迭代器,我们可以开始研究现代c++的函数式编程概念。标准库中的许多函数采用由两个迭代器(开始和结束)和匿名函数(λ函数)表示的一系列元素作为参数,然后将此匿名函数应用于范围内的每个元素。它们被称为匿名函数,因为它们不是绑定到变量,而是它们是短逻辑块,作为内联参数传递给更高阶函数。通常,它们对于传递给它们的函数是唯一的,因此不需要具有名称(匿名)的整个开销。

  

有了它,我们可以实现类似于排序,映射,过滤等的构造,这些构造在JavaScript等语言中很容易实现:

  
 <代码> (1、2、3、4)。地图(x=比;* x)。过滤器(x=比;x % 2===1) .sort ((a, b)=比;b - a)  
  

c++中的代码并不简洁,但结构相同。来自性病库的许多函数式编程助手以半开间隔运行,这意味着包括较低范围,排除较高范围。

  
 <代码>//https://repl.it/@MrToph CPPBasics-Lambdas
  # include & lt; iostream>
  # include & lt; vector>//排序,地图等。
  # include & lt; algorithm>
  
  使用名称空间性病;
  
  int main ()
  {
  vectorv {2、1、4、3、6, 5};//前两个参数范围//逆序函数()包括直到v.end()(排除)//类型提升
  sort(逆序函数(),v.end ());//在c++中,功能变异容器(与不变性并返回新数组在其他语言)
  (汽车i=逆序函数();我!=v.end ();我+ +)
  {
  cout & lt; & lt;*我& lt; & lt;“\ n”;
  }//一遍在降序排序//第三个参数是一个lambda函数用作排序比较
  sort(逆序函数(),v.end (), [] (int, int b){返回一个比;b;});//功能for_each,还可以使用汽车的类型
  v.end for_each(逆序函数()(),[](int) {cout & lt; & lt;& lt; & lt;“\ n”;});
  
  vector名字{“爱丽丝”、“Bob”、“夏娃”};
  vector问候(names.size ());//转换在JavaScript中就像一个地图//函数适用于每个元素的容器//并将结果写入(可能是相同的)容器//遍历前两个参数范围//第三个参数是在哪里写的开始
  变换(names.begin (), names.end (), greetings.begin(),[](常量字符串,名称){
  返回“Hello”+名称+“\ n”;
  });//过滤问候问候的长度
  汽车new_end=std:: remove_if (greetings.begin (), greetings.end(),[](常量字符串,g) {
  在返回g.size ();10;
  });//遍历到新的过滤后的长度
  new_end for_each (greetings.begin(),[](常量字符串,g) {cout & lt; & lt;g;});//或者,真正消除过滤元素向量//所以greetings.end new_end()是一样的//问候。擦除(new_end greetings.end ());//让我们找鲍勃
  字符串search_name=癇ob”;//我们可以使用search_nameλ范围以外的变量定义//注意到[和]不是[]这意味着我们要做“变量捕获”//即让所有局部变量可以使用lambda函数
  汽车鲍勃=find_if (names.begin (), names.end(),[和](常量字符串,名称){
  返回名称==search_name;
  });//find_if返回一个迭代器referncing结束迭代器对象或发现如果没有被发现
  如果(鲍勃!=names.end ())
  cout & lt; & lt;“发现名称”& lt; & lt;*鲍勃& lt; & lt;“\ n”;
  }

c++开发EOS基础指南:迭代器和λ表达式