STL - C++ 11的Lambda表达式(上)

简介: Lambda始自C++ 11,是一种在表达式或语句内指定函数行为的定义式。 你可以定义函数行为作为对象,以inline实参的形式传给算法作为predicate(判断式)。 eg: std:transform(coll.

Lambda始自C++ 11,是一种在表达式或语句内指定函数行为的定义式。

你可以定义函数行为作为对象,以inline实参的形式传给算法作为predicate(判断式)。

eg:

std:transform(coll.begin(), coll.end(),  // source

                     coll.begin(),                 // destination

 

 

               

#include <algorithm>
#include <deque>
#include <iostream>
#include "LambdaTest.h"
#include "../../Core/ContainerUtil.h"

using namespace std;

deque<int> coll = { 1, 3, 19, 5, 13, 7, 11, 2, 17 };

cout << "all elements:" << endl;
ContainerUtil<deque<int>>::printElements(coll);

int x, y;
cout << "Input x: ";
cin >> x;
cout << endl;
cout << "Input y: ";
cin >> y;
cout << endl;
auto pos = find_if(coll.cbegin(), coll.cend(),  // range
    [=](int i) {                 // search criterion
    return i > x && i < y;
});

cout << "first elem >"<< x <<" and <"<< y <<": " << *pos << endl;

      [](double d) {          // lambda as function object

 

 

 

                       return d*d*d;

                     });

 

看个简单的例子:

findFirstInRange.cpp

 

运行结果:

all elements:   1  3  19  5  13  7  11  2  17

Input x: 5

Input y: 18

first elem >5 and <18: 13

 

注意点:

[=]

这个符号表明在lambda被声明时已有效的所有符号都以传值(by value)的形式传入lambda体内

[&]

这个符号表明在lambda被声明时已有效的所有符号都以传引用(by reference)的形式传入lambda体内

lambda内部可以改动他们的值

 

上面例子lambda的等价物

auto pos = find_if(coll.cbegin(), coll.cend(),  // range
    [=](int i) {                 // search criterion
    return i > x && i < y;
});

它等价于

1. 手写的循环

 

deque<int>::iterator pos;
for (pos = coll.begin;pos!=coll.end(); ++pos)
{
  if (*pos > x && *pos < y)
  {
     break;
  }
}

 

2. predicate(判断式)

 

bool pred(int I)
{
  return I > x && I < y;
}

...

pos = find_if(coll.begin(), coll.end(), pred);

 

目录
相关文章
|
1月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
93 10
|
1月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
48 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
1月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
68 5
|
1月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
52 1
|
1月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
61 6
|
1月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
52 7
|
1月前
|
算法 安全 Linux
【C++STL简介】——我与C++的不解之缘(八)
【C++STL简介】——我与C++的不解之缘(八)
|
1月前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
52 5
|
1月前
|
安全 C语言 C++
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
34 4
|
1月前
|
编译器 C语言 C++
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
48 3