C++标准库笔记-1

声明:这个博文所有内容均来自于C++标准库-自学教程与参考手册(第二版)英文版 上册。如果转载,务必附带本声明,请注明出处。

1、nullptr与std::nullptr_t
C++11允许使用nullptr来替代0或者NULL,用于初始化一个空指针。nullptr是新关键字,可以将指针转换为空而不是任何的整数类型。nullptr类型为std::nullptr_t,在< cstddef>有定义。
2、auto
自动类型推断。
3、标准初始化与列表初始化(Uniform Initialization and Initializer Lists)

int values[] { 1, 2, 3};
std::vector<int> v{ 2, 3, 4, 5, 20};
std::vector<std::string> cities {
"Berlin", "New York", "London" 
};
std::complex<double> c{4.0, 3.0};
int i;//未定义初始值
int j{}; //初始化为0
int *p; //未初始化
int *q{}; //初始化为nullptr

可以使用std::initializer_list进行初始化。

void print(std::initializer_list<int> vals)
{
    for(auto p = vals.begin();p!=vals.end();++p)
        std::cout << *p << "\n";
}
print({12, 3, 5, 11, 24, 44});//把一个列表传递到一个函数

4、C++11 的 range-based for loops
其通用语法如下:

for(decl: coll)
{ ; }

其中decl是申明的一个用于存储collection coll中每个元素的变量。

for(int i: {1, 2, 3, 4, 5})
    std::cout << i << std::endl;

还可以使用引用:

std::vector<double> vec;
//自己对vec初始化
for(auto& elem: vec)
    elem *= 3; //每个元素增大到原来的3倍

也可以使用模板:

template <typename T>
void printElements(const T& coll)
{
    for(const auto& elem : coll)
        std::cout << elem << std::endl;

5、New String literals
从c++11开始,我们可以定义raw string了,只需要在字符串前面加上R,具体格式为:R”(…)”.
例如:在以前我们使用”\\n”才能表示出”\n”这个字面字符串,现在没必要这么麻烦了,我们只需要 R”(\n)”。
Encoding String Literals:
u8: 定义一个utf-8编码
u: 定义一个 char16_t编码
U: 定义一个 char32_t 编码
L: 定义一个wchar_t 编码
6、lambdas
Lambda表达在其他语言早已出现,如python,从C++11开始, C++引入这个新特性。
给个例子吧:

int x = 0; 
int y = 42;
auto qLambda = [x, &y] {
                        std::cout << "x: " << x << std::endl
                                  << "y: " << y << std::end;
                        ++y;//可以改变y的值,因为我们传递的是引用,但是不能改变x的值,x在此是只读的变量
};
x = y = 77;
qLambda(); // 输出 x = 77, y = 77;
qLambda(); // 输出 x = 77, y = 78;
std::cout << "final y: " << y << std:: endl; // y = 79;

也可以使用mutable来修饰这个lambda表达,使得传进来的值即是不是引用,也是可以修改的。

你可能感兴趣的:(C++标准库笔记-1)