c++11 特性 简单介绍

根据c++ primer第五版总结,可以用来快速回顾一下这些性质

  • long long 类型 定义为至少有32位那么长。一般没用。

  • 列表初始化 列表是一组由花括号和逗号组成的元素集合,例如{1,2,3}。 我们可以使用花括号来进行初始化变量。 int a{0}; 等号运算符在声明时不是赋值,而是初始化,所以也可以用下面的形式初始化: int a = {0}; 这样的效果和int a = 0;是一样的。

  • nullptr 常量 这是由于在c++11之前,为指针赋值空指针用的是0来直接赋值的。现在使用nullptr更好。nullptr实质上是一个只可以有右值并只能类型转换为指针且值为0地址的一个对象,由此可以解决一些问题,相关资料可以查看如何实现nullptr。

  • constexpr 变量 const expressions 常量表达式的意思。和const修饰的区别是,const表示这个变量名在之后使用的时候得是常量,而constexpr不仅如此,还要求初始化该变量时使用的表达式必须也为常量才可以。

  • 类型别名 using uint = unsigned int typedef uint unsigned int 这两句是等价的

  • auto 类型说明符 声明并定义变量时,求助编译器根据定义类型自动推断声明的变量类型。

  • decltype 类型指示符 声明变量时,可以使用decltype(expressions)求出表达式的类型,作为被声明变量的类型

  • 类内初始化

    class A {
    public:
        int a = 7;
    };

这等同于之前版本中的:

    class A {
    public:
        int a;
        A() : a(7) {}
    };
  • 使用auto或decltype推断类型 auto len = line.size(); 自动推断string::size_type更好

  • 范围for语句 打印字符串中的字符 for(auto c:str) cout « c « endl; 类似于Python中的for in语句

  • vector嵌套 vector<vector这里在旧的编译器上需要有个空格不能让两个尖尖连在一起>

  • 列表初始化vector对象 vector strs = {“a”, “bb”, “ccc”};

  • cbegin 和 cend 返回类型是const_iterator类型的迭代器

  • 在二维数组中使用auto

int mat[3][4];
int main()
{
    for (int(*p)[4] = mat; p != mat + 3; p++)
    {
        /* ... */
    }
    for (auto p = mat; p != mat + 3; p++)
    {
        /* ... */
    }
}
  • 除法取整 c++11规定除法一律向0取整

  • 列表赋值vector对象 vector strs; strs = {“a”, “bb”, “ccc”};

  • 139 使用sizeof获取类的成员的大小 通常情况下只有通过对象才能访问类的成员。但是sizeof可以直接判断成员大小。

  • 168 范围for语句 在范围for语句中不能增加vector对象的元素,这是因为可能导致范围for语句的end元素变得无效了。这和Python中范围循环可能导致的问题是一样的。

  • 197 initializer_list initializer_list是一种模板类型,对象元素永远是常量,类型必须相同。花括号的列表就是这种对象。

  • 203 列表初始化返回值 return 一个 initializer_list 列表可以对返回类型为vector的对象进行临时量初始化。

  • 206 定义尾置返回类型 声明一个返回数组指针的函数 int * func(int i)这样是不太对的,因为返回了一个指针而不是数组指针 int (* func(int i))[10] 这样的话才是返回大小为10的一个数组指针 也可以这样写:auto func(int i) -> int(*)[10];

  • 206 使用decltype简化返回类型 可以使用decltype来简化返回类型,但是这种需求较少见。

  • 214 constexpr 函数 constexpr 函数是返回类型为字面值的函数,且只能有一条return语句。

  • 237 default默认构造函数 可以对构造函数赋值等号表示使用编译器提供的默认的构造函数。

  • 246 类内的初始化 新标准可以在类内就初始化赋值成员

  • 261 委托构造函数 构造函数初始化时,使用初始值列表来初始化成员。除此之外,还可以使用其他构造函数帮助构造。 例如构造函数是func(int a,int b)委托构造函数func():func(0,0){}这样就可以当做默认是0,0来构造了。

  • 268 constexpr 构造函数 用于生成constexpr对象

  • 284 使用string类型来表示文件路径 在stream类型中,原来只能使用c字符串,现在可以使用string类型的字符串了

  • 293 array 与 forward_list 非常的快,与手写list速度相当,比数组安全

  • 300 使用列表初始化容器 list authors = {“milton”, “shakespeare”, “austen”}; vector<const char*> articles = {“a”, “b”, “cc”};

  • 303 容器的非成员swap 使用swap可以快速交换两个内容的容器

  • 308 使用insert的返回之值 新标准的insert在插入成功之后返回一个迭代器,该迭代器的位置是指向插入的新元素。使用这个特性可以反复在该位置插入多个元素。

  • 308 使用emplace函数 使用emplace函数可以实现构造而不是复制。 使用这个方法可以传入构造函数所所需要的参数而不用构造出对象在2复制一份进取。

  • shrink_to_fit 对容器调用该函数,会释放多余的vector或者是string所占用的空间。一般没什么用

  • string 类型的数值转换函数 to_string 表示一组重载函数,可以将int、double类型的数据转换为string类型的数据。 Stoi 可以将string转换为int,类似的还有其他的函数,包括不同基的、还有浮点数的

  • 346 lambda 表达式 简单的lambda表达式 auto f = []{return 42;}; 这里将一个lambda表达式赋值给f。之后可以调用f()获得42 如何向lambda表达式传递参数? [](int a, int b){return a>b;}; 但是有的时候不想传递参数,仍然使得lambda表达式使用外部的变量怎么办? [&out](int a, int b){return a<out && out < b;}; 但是我不想让上面这个表达式返回int,而是double怎么办? [&out](int a, int b)->double{return a<out && out < b;}

  • 354 bind bind函数可以将一个函数的调用改成简单的调用

  • 377 关联容器的列表初始化 map<string, string> authors={ {“joncy”, “james”} }; set exclude = {“the”, “but” };

  • 380 列表初始化pair的返回类型 return 一个 {}表示的列表到pair类型可以自动转换。

  • 384 pair的列表初始化 当向map插入pair时,最简单的方式是插入花括号表示的一对键值。插入的内容会初始化为pair插入。

  • 394 无序容器 map和set前面加上unordered就是无序容器。底层使用hash实现。需要实现存储元素的hash模板。

  • 400 智能指针 shared_ptr允许多个指针指向同一个对象。unique_ptr则独占所指的对象。 智能指针是模板,在声明时需要显示提供类型,类似vector的使用。 shared_ptr p1;

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计