c++11 Lambda函数与表示式

在调用C++标准程序库算法函数诸如算法函数诸如sort和find_if时候,第3个参数往往需要输入一个函数对象,既麻烦又冗赘,

还好C++11有了Lambda的支持,举例而言,程序员不用写像下面这样:

// 查找字符串长度是5的Data
struct Cmpare
{
	Cmpare(int n) : len_(n)
	{}

	bool operator()(const Data& d)
	{
		return (d.data_.length() == len_);
	}

private:
	int len_;
};
vector<Data>::iterator it = std::find_if(my_vec.begin(), my_vec.end(), Cmpare(5));
而可以用Lambda函数代替:

int find_len = 5;
it = std::find_if(my_vec.begin(), my_vec.end(), [find_len](const Data& d) {
	return (d.data_.length() == find_len);
});
Lambda函数体内需要什么变量,就在方括号中指明,方括号内容的含义:
[] // 沒有定义任何参数。使用未定义参数会导致错误。
[x, &y] // x 以传值方式传入,y 以传引用方式传入。
[&] // 任何被使用到的外部参数皆以引用方式使用。
[=] // 任何被使用到的外部参数皆以传值方式使用。
[&, x] // x 显式地以传值方式加以使用。其余参数以传入方式使用。
[=, &z] // z 显式地以引用方式加以使用。其余参数以传值方式使用。
在成员函数中指涉对象的 this 指针,必须要显式的传入 lambda 函数, 否则成员函数中的 lambda 函数无法使用任何该对象的变量或函数。
[this]() { this->SomePrivateMemberFunction(); };

[函数对象参数](操作符重载函数参数)->返回值类型{函数体}

vector<int> vec{1,2,3,4,5};
int A = 2;
int B = 3;
for_each(begin(vec), end(vec), [B](int &x){cout<<(x+B)<<endl;});   (1)
for_each(begin(vec), end(vec), [=](int &x){cout<<x*=(A+B)<<endl;}); (2)
for_each(begin(vec), end(vec), [=](int &x)->int{ return x*=(A+B);}); (3)

  • []内的参数指的是Lambda表达式可以取得的全局变量。(1)函数中的b就是指函数可以得到在Lambda表达式外的全局变量
  • 如果在[]中传入=的话,即是可以取得所有的外部变量,如(2)和(3)Lambda表达式
  • ()内的参数是每次调用函数时传入的参数
  • ->后加上的是Lambda表达式返回值的类型,如(3)中返回了一个int类型的变量
class CTest
{
public:
    CTest() : m_nData(20) { NULL; }
    void TestLambda()
    {
        vector<int> vctTemp;
        vctTemp.push_back(1);
        vctTemp.push_back(2);
        
        // 无函数对象参数,输出:1 2
        {
            for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; });
        }
        
        // 以值方式传递作用域内所有可见的局部变量(包括this),输出:11 12
        {
            int a = 10;
            for_each(vctTemp.begin(), vctTemp.end(), [=](int v){ cout << v+a << endl; });
        }
        
        // 以引用方式传递作用域内所有可见的局部变量(包括this),输出:11 13 12
        {
            int a = 10;
            for_each(vctTemp.begin(), vctTemp.end(), [&](int v)mutable{ cout << v+a << endl; a++; });
            cout << a << endl;
        }
        
        // 以值方式传递局部变量a,输出:11 13 10
        {
            int a = 10;
            //注意:在lambda表达式中的 a 只是一个拷贝,添加mutable之后,可以修改a的值,但只是修改拷贝的a
            for_each(vctTemp.begin(), vctTemp.end(), [a](int v)mutable{ cout << v+a << endl; a++; });
            cout << a << endl;
        }
        
        // 以引用方式传递局部变量a,输出:11 13 12
        {
            int a = 10;
            for_each(vctTemp.begin(), vctTemp.end(), [&a](int v){ cout << v+a << endl; a++; });
            cout << a << endl;
        }
        
        // 传递this,输出:21 22
        {
            for_each(vctTemp.begin(), vctTemp.end(), [this](int v){ cout << v+m_nData << endl; });
        }
        
        // 除b按引用传递外,其他均按值传递,输出:11 12 17
        {
            int a = 10;
            int b = 15;
            for_each(vctTemp.begin(), vctTemp.end(), [=, &b](int v){ cout << v+a << endl; b++; });
            cout << b << endl;
        }
        
        // 操作符重载函数参数按值传递,输出:1 2
        {
            for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; });
        }
        
        // 操作符重载函数参数按引用传递,输出:2 3
        {
            for_each(vctTemp.begin(), vctTemp.end(), [](int &v){ v++; cout<<v<<endl;});
        }
        
        
        // 空的Lambda表达式
        {
            [](){}();
            []{}();
        }
    }
    
private:
    int m_nData;
};



数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值