C++11特性

  1. C11中有左值引用和右值引用
  2. C++:C++11的牛逼特性
  3. c++11 你需要知道这些就够了
  4. 浅谈C++11新特性
  5. C++ Rvalue References Explained

 

1、类型说明符auto

•和只对应一种特定类型的说明符(int、double等)不同,auto用于从初始化表达式中推断出变量的数据类型。因此,auto定义的变量必须有初始值。

3、空指针nullptr

•nullptr是为了解决原来C++标准中NULL的二义性问题而引进的一种新的类型,因为NULL实际上代表的是0。

4、基于范围的for循环

•基于范围(range-based)的for循环:简化了常见的循环,对数组或容器类等的每个元素执行相同的操作(VS2010目前不支持)。

6、虚函数的override和final指示符

•override,表示函数应当重写基类中的虚函数(VS2010目前支持)。

•final,表示派生类不应当重写这个虚函数(VS2010目前不支持)。

10、匿名函数

•匿名函数,又称为Lambda函数(也叫Lambda表达式)。

•Lambda表达式具体形式如下:

•[capture](parameters)->return-type{body}

[ capture ] ( params ) mutable exception attribute -> ret { body } (1)

[ capture ] ( params ) -> ret { body } (2)

[ capture ] ( params ) { body } (3)

[ capture ] { body } (4)

其中

(1) 是完整的 lambda 表达式形式,

(2) const 类型的 lambda 表达式,该类型的表达式不能改捕获("capture")列表中的值。

(3)省略了返回值类型的 lambda 表达式,但是该 lambda 表达式的返回类型可以按照下列规则推演出来: 如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。 如果没有 return 语句,则类似 void f(...) 函数。 省略了参数列表,类似于无参函数 f()。

[] // 不引用外部变量

[x, &y] // x引用方式 ,y 传值

[&] // 任何使用的外部变量都是引用方式。

[=] // 任何被使用到的外部都是传值方式。

[&, x] // 除x传值以外其他的都以引用方式。

[=, &z] // 除z引用以外其他的都是以传值方式使用。

int main()
{
    std::vector<int> c { 1,2,3,4,5,6,7 };
    int x = 5;
    c.erase(std::remove_if(c.begin(), c.end(), [x](int n) { return n < x; } ), c.end());
 
    std::cout << "c: ";
    for (auto i: c) {
        std::cout << i << ' ';
    }
    std::cout << '\n';
 
    // 可以用auto 接收一个lambda 表达式。
    auto func1 = [](int i) { return i+4; };
    std::cout << "func1: " << func1(6) << '\n'; 
 
    // std::function 也可以接收lambda 表达式。
 
    std::function<int(int)> func2 = [](int i) { return i+4; };
    std::cout << "func2: " << func2(6) << '\n'; 
 
    std::function<int()> func3 = [x]{return x;};
    std::cout << "func3: " << func3() << '\n';
 
 
    std::vector<int> someList = {1,2,3};  //这里是c++11
    int total = 0;
    double sum = 0.0f;
    std::for_each(someList.begin(), someList.end(), [&total](int x) { total += x; });
    std::cout << total << '\n';
    std::for_each(someList.begin(), someList.end(), [&](int x){ total += x; sum += x;});
    std::cout << total << '\n';
    std::cout << sum << '\n';
 
    //再写一种简单的lambda
    [](){std::cout<<"就地展开的lambda\n";}();
 
}

auto与for配合使用

std::map<std::string, std::vector<int>> map;
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
map["one"] = v;
 
for(const auto& kvp : map) 
{
  std::cout << kvp.first << std::endl;
 
  for(auto v : kvp.second)
  {
     std::cout << v << std::endl;
  }
}
 
int arr[] = {1,2,3,4,5};
for(int& e : arr) 
{
  e = e*e;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值