目录
一、c++11语法
1. 自动类型推导 (auto)
2. 基于范围的 for 循环
3. Lambda 表达式
4. 智能指针
5. 右值引用和移动语义
6. nullptr 关键字
7. constexpr 关键字
8. 初始化列表
9. std::thread 多线程支持
10. std::function 和 std::bind
11. std::unordered_map 和 std::unordered_set
12. std::array
13. std::tuple
14. std::chrono 时间库
15. override 和 final 关键字
二、c++11库
1. 智能指针库 ( )
2. 多线程库 ( , , , )
3. 时间库 ( )
4. 随机数库 ( )
5. 正则表达式库 ( )
6. 无序容器 ( , )
7. 元组库 ( )
8. 函数对象库 ( )
9. 数组容器 ( )
10. 原子操作库 ( )
11. 类型特征库 ( )
12. 初始化列表支持 ( )
总结
auto
)C++11 引入了 auto
关键字,用于自动推导变量的类型。
auto x = 10; // x 的类型被推导为 int
auto y = 3.14; // y 的类型被推导为 double
auto z = "hello"; // z 的类型被推导为 const char*
auto
不能用于函数参数或类成员变量的声明。for
循环C++11 提供了更简洁的遍历容器的方式。
std::vector vec = {1, 2, 3, 4};
for (auto& val : vec) {
val *= 2; // 修改容器中的值
}
Copy
auto&
)。Lambda 表达式允许在代码中定义匿名函数。
auto add = [](int a, int b) { return a + b; };
int result = add(3, 4); // result = 7
[]
:不捕获任何外部变量。[&]
:以引用方式捕获所有外部变量。[=]
:以值方式捕获所有外部变量。[&x, y]
:混合捕获。C++11 引入了智能指针,用于自动管理动态内存,避免内存泄漏。
std::unique_ptr
:独占所有权的智能指针。std::unique_ptr ptr(new int(10));
std::shared_ptr
:共享所有权的智能指针。std::shared_ptr ptr1 = std::make_shared(10);
std::shared_ptr ptr2 = ptr1; // 共享所有权
std::weak_ptr
:弱引用,用于解决 shared_ptr
的循环引用问题。、std::weak_ptr wptr = ptr1;
delete
的错误。C++11 引入了右值引用(&&
)和移动语义,用于优化资源管理。
int&& rref = 10; // 右值引用
std::vector v1 = {1, 2, 3};
std::vector v2 = std::move(v1); // 移动 v1 的资源到 v2
左值拷贝为深拷贝
右值拷贝将将亡值移动拷贝;将将亡值的数据给继承者,然后自己销毁
左值move以后,左值将会被释放
左值引用减少了拷贝,左值引用传参,传引用返回
函数内的局部变量不能用引用返回
nullptr
关键字C++11 引入了 nullptr
,用于替代 NULL
,表示空指针。
int* ptr = nullptr; // 更安全的空指针表示
NULL
可能引起的类型歧义。constexpr
关键字constexpr
用于声明编译时常量或常量表达式。
constexpr int square(int x) {
return x * x;
}
int arr[square(3)]; // 编译时计算
C++11 引入了统一的初始化语法。
std::vector vec = {1, 2, 3, 4}; // 初始化列表
int arr[]{1, 2, 3}; // 数组初始化
std::thread
多线程支持C++11 提供了标准的多线程库。
#include
void task() {
std::cout << "Hello from thread!\n";
}
int main() {
std::thread t(task);
t.join(); // 等待线程结束
return 0;
}
std::function
和 std::bind
std::function
:用于存储可调用对象(函数、Lambda、函数对象等)。 std::function func = [](int a, int b) { return a + b; };
int result = func(3, 4); // result = 7
std::bind
:用于绑定函数参数。 auto add = std::bind([](int a, int b) { return a + b; }, std::placeholders::_1, 10);
int result = add(5); // result = 15
std::unordered_map
和 std::unordered_set
C++11 引入了基于哈希表的无序容器。
std::unordered_map map = {{"apple", 1}, {"banana", 2}};
std::unordered_set set = {1, 2, 3};
std::array
C++11 提供了固定大小的数组容器。
std::array arr = {1, 2, 3};
std::tuple
std::tuple
用于存储多个不同类型的值。
std::tuple t(1, 3.14, "hello");
int x = std::get<0>(t); // x = 1
std::chrono
时间库C++11 提供了标准的时间库。
#include
auto start = std::chrono::high_resolution_clock::now();
// 执行一些操作
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast(end - start);
std::cout << "Time taken: " << duration.count() << " ms\n";
override
和 final
关键字override
:显式标记重写虚函数。 class Base {
public:
virtual void func() {}
};
class Derived : public Base {
public:
void func() override {} // 显式标记重写
};
final
:禁止类被继承或函数被重写。 class Base final {}; // 禁止继承
)C++11 引入了智能指针,用于自动管理动态内存,避免内存泄漏。
std::unique_ptr
:独占所有权的智能指针。 std::unique_ptr ptr(new int(10));
std::shared_ptr
:共享所有权的智能指针。 std::shared_ptr ptr1 = std::make_shared(10);
std::shared_ptr ptr2 = ptr1; // 共享所有权
std::weak_ptr
:弱引用,用于解决 shared_ptr
的循环引用问题。 std::weak_ptr wptr = ptr1;
std::make_shared
和 std::make_unique
(C++14):更安全地创建智能指针。 auto ptr = std::make_shared(10);
,
,
,
)C++11 提供了标准的多线程支持。
std::thread
:创建和管理线程。 #include
void task() {
std::cout << "Hello from thread!\n";
}
int main() {
std::thread t(task);
t.join(); // 等待线程结束
return 0;
}
std::mutex
:互斥锁,用于保护共享资源。 std::mutex mtx;
mtx.lock();
// 临界区
mtx.unlock();
std::lock_guard
和 std::unique_lock
:RAII 风格的锁管理。 std::lock_guard lock(mtx); // 自动解锁
std::condition_variable
:线程间同步。 std::condition_variable cv;
cv.notify_one(); // 唤醒一个等待线程
std::future
和 std::promise
:异步操作和结果传递。 std::promise p;
std::future f = p.get_future();
p.set_value(42); // 设置结果
int result = f.get(); // 获取结果
)C++11 提供了高精度的时间库。
std::chrono::system_clock
:系统时钟。std::chrono::steady_clock
:单调时钟。std::chrono::high_resolution_clock
:高精度时钟。auto start = std::chrono::high_resolution_clock::now();
// 执行一些操作
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast(end - start);
std::cout << "Time taken: " << duration.count() << " ms\n";
)C++11 提供了更强大的随机数生成工具。
std::mt19937
:Mersenne Twister 随机数生成器。std::uniform_int_distribution
和 std::uniform_real_distribution
:均匀分布。std::mt19937 rng(std::random_device{}());
std::uniform_int_distribution dist(1, 100);
int random_number = dist(rng); // 生成 1 到 100 的随机数
)C++11 引入了正则表达式支持。
std::regex
:正则表达式对象。std::smatch
:匹配结果。std::string text = "Hello, 123 world!";
std::regex pattern(R"(\d+)"); // 匹配数字
std::smatch matches;
if (std::regex_search(text, matches, pattern)) {
std::cout << "Found: " << matches.str() << "\n";
}
,
)C++11 引入了基于哈希表的无序容器。
std::unordered_map
:无序映射。 std::unordered_map map = {{"apple", 1}, {"banana", 2}};
std::unordered_set
:无序集合。 std::unordered_set set = {1, 2, 3};
)C++11 提供了元组(std::tuple
),用于存储多个不同类型的值。
std::tuple t(1, 3.14, "hello");
int x = std::get<0>(t); // x = 1
)C++11 增强了函数对象和函数包装器的支持。
std::function
:存储可调用对象。 std::function func = [](int a, int b) { return a + b; };
int result = func(3, 4); // result = 7
std::bind
:绑定函数参数。 auto add = std::bind([](int a, int b) { return a + b; }, std::placeholders::_1, 10);
int result = add(5); // result = 15
)C++11 提供了固定大小的数组容器 std::array
。
std::array arr = {1, 2, 3};
)C++11 提供了原子操作支持,用于无锁编程。
std::atomic
:原子类型。 std::atomic counter(0);
counter.fetch_add(1); // 原子操作
)C++11 提供了类型特征支持,用于编译时类型检查。
std::is_integral
:检查是否为整数类型。 static_assert(std::is_integral::value, "Not an integral type");
std::enable_if
:条件编译。 template::value>>
void func(T x) {}
)C++11 引入了初始化列表支持。
std::vector vec = {1, 2, 3, 4}; // 初始化列表
C++11 引入了许多现代编程语言的特性,极大地提升了 C++ 的表达能力和开发效率。掌握这些特性可以帮助开发者编写更高效、更安全的代码。
C++11 的标准库扩展极大地增强了语言的功能性,提供了更现代化的工具和组件。这些库组件与语言特性相结合,使得 C++11 成为一个更强大、更高效的编程语言版本。