C++ 11新特性有哪些

1. 简介

C++ 11是C++语言的一个新版本,引入了许多新特性和改进,包括语言核心的改进、标准库的增强以及性能的提升。本文将讨论C++ 11中的一些重要特性。

2. 自动类型推断

2.1 auto关键字

C++ 11引入了auto关键字,它可以自动推断变量的类型,让代码更简洁、更易读。使用auto声明变量时,初始化语句中的表达式必须有明确的类型,否则编译器将无法推断变量的类型。

auto x = 42; // x的类型为int

auto d = 3.14; // d的类型为double

auto s = "hello"; // s的类型为const char*

2.2 decltype关键字

C++ 11还引入了decltype关键字,它可以推断表达式的类型。decltype(expr)返回表达式expr的类型,但不会执行表达式。

int x = 42;

decltype(x) y = x; // y的类型为int

3. 右值引用

3.1 左值和右值的概念

在C++ 11中,表达式可以被归类为左值或右值。左值指的是可以被取地址的表达式,比如变量、数组元素、成员变量,右值指的是不能被取地址的表达式,比如常量、临时变量。

3.2 右值引用

C++ 11引入了右值引用,可以用来绑定到右值上,右值引用的语法是“&&”。右值引用可以用来实现移动语义和完美转发,这是提高代码效率和安全性的重要特性。

void foo(string& x) {

cout << "lvalue reference" << endl;

}

void foo(string&& x) {

cout << "rvalue reference" << endl;

}

int main() {

string str = "hello";

foo(str); // 调用foo(string&)

foo("hello"); // 调用foo(string&&)

return 0;

}

4. Lambda表达式

4.1 Lambda表达式的定义

Lambda表达式是C++ 11中引入的一项函数特性,它可以用来创建匿名函数。Lambda表达式的语法如下:

[capture-list] (parameter-list) -> return-type { body }

其中,capture-list是捕获列表,用来控制Lambda表达式的访问权限;parameter-list是参数列表;return-type是返回类型;body是Lambda表达式的函数体。

4.2 Lambda表达式的使用

Lambda表达式可以用来替代函数对象,尤其在STL算法中使用广泛。

vector<int> v = {1, 2, 3, 4, 5};

int sum = accumulate(v.begin(), v.end(), 0, [](int a, int b) { return a + b; });

5. 新的容器类

5.1 unordered_map

C++ 11引入了std::unordered_map,它是一个基于哈希表的关联容器,提供O(1)的平均插入、删除、查找操作。与std::map相比,std::unordered_map不会对元素进行排序,并且不支持lower_bound和upper_bound操作。

unordered_map<string, int> mymap = {{"apple", 5}, {"banana", 10}, {"orange", 15}};

int count = mymap["apple"]; // 访问元素

mymap["pear"] = 20; // 插入元素

5.2 unordered_set

C++ 11还引入了std::unordered_set,它是一个基于哈希表的集合容器,提供O(1)的平均插入、删除、查找操作。与std::set相比,std::unordered_set不会对元素进行排序,并且不支持lower_bound和upper_bound操作。

unordered_set<int> myset = {1, 2, 3, 4, 5};

bool exists = myset.find(3) != myset.end(); // 查找元素

myset.erase(4); // 删除元素

6. 线程库

C++ 11标准库中引入了线程库,包括std::thread、std::mutex、std::condition_variable等类,让C++程序员更容易地编写并发代码。

#include <thread>

#include <iostream>

void mythread(int id) {

std::cout << "Thread " << id << " is running" << std::endl;

}

int main() {

std::thread t1(mythread, 1);

std::thread t2(mythread, 2);

t1.join();

t2.join();

return 0;

}

7. 总结

C++ 11引入了许多新特性和改进,使得C++代码更容易写、更容易读、更安全、更高效。本文只介绍了C++ 11中的一些重要特性,希望读者能够掌握这些特性,并在实际开发中加以应用。

后端开发标签