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中的一些重要特性,希望读者能够掌握这些特性,并在实际开发中加以应用。