C++11语法及库详解

目录

 一、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. 初始化列表支持 ( )

总结


 一、c++11语法

1. 自动类型推导 (auto)

C++11 引入了 auto 关键字,用于自动推导变量的类型。

auto x = 10;       // x 的类型被推导为 int
auto y = 3.14;     // y 的类型被推导为 double
auto z = "hello";  // z 的类型被推导为 const char*
  • 优点:简化代码,尤其是在处理复杂类型(如迭代器)时。
  • 注意:auto 不能用于函数参数或类成员变量的声明。

2. 基于范围的 for 循环

C++11 提供了更简洁的遍历容器的方式。

std::vector vec = {1, 2, 3, 4};
for (auto& val : vec) {
    val *= 2;  // 修改容器中的值
}
Copy
  • 优点:避免手动管理迭代器,代码更简洁。
  • 注意:遍历时默认是值传递,如果需要修改容器中的值,需使用引用(auto&)。

3. Lambda 表达式

Lambda 表达式允许在代码中定义匿名函数。

auto add = [](int a, int b) { return a + b; };
int result = add(3, 4);  // result = 7
  • 捕获列表:
    • []:不捕获任何外部变量。
    • [&]:以引用方式捕获所有外部变量。
    • [=]:以值方式捕获所有外部变量。
    • [&x, y]:混合捕获。
  • 优点:简化代码,尤其是在需要传递函数对象时。

4. 智能指针

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 的错误。

5. 右值引用和移动语义

C++11 引入了右值引用(&&)和移动语义,用于优化资源管理。

  • 右值引用:
int&& rref = 10;  // 右值引用
  • 移动语义:
std::vector v1 = {1, 2, 3};
std::vector v2 = std::move(v1);  // 移动 v1 的资源到 v2
  • 优点:避免不必要的拷贝,提高性能。
  • 左值拷贝为深拷贝

    右值拷贝将将亡值移动拷贝;将将亡值的数据给继承者,然后自己销毁

    左值move以后,左值将会被释放

    左值引用减少了拷贝,左值引用传参,传引用返回

    函数内的局部变量不能用引用返回


6. nullptr 关键字

C++11 引入了 nullptr,用于替代 NULL,表示空指针。

int* ptr = nullptr;  // 更安全的空指针表示

  • 优点:避免 NULL 可能引起的类型歧义。

7. constexpr 关键字

constexpr 用于声明编译时常量或常量表达式。

constexpr int square(int x) {
    return x * x;
}
int arr[square(3)];  // 编译时计算

  • 优点:提高性能,允许在编译时进行计算。

8. 初始化列表

C++11 引入了统一的初始化语法。

std::vector vec = {1, 2, 3, 4};  // 初始化列表
int arr[]{1, 2, 3};                  // 数组初始化
  • 优点:简化初始化代码,避免歧义。

9. std::thread 多线程支持

C++11 提供了标准的多线程库。

#include 
void task() {
    std::cout << "Hello from thread!\n";
}
int main() {
    std::thread t(task);
    t.join();  // 等待线程结束
    return 0;
}
  • 优点:标准化多线程编程,避免平台依赖。

10. 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
  • 优点:增强函数的灵活性。

11. std::unordered_map 和 std::unordered_set

C++11 引入了基于哈希表的无序容器。

std::unordered_map map = {{"apple", 1}, {"banana", 2}};
std::unordered_set set = {1, 2, 3};
  • 优点:提供更高效的查找性能(平均 O(1) 时间复杂度)。

12. std::array

C++11 提供了固定大小的数组容器。

std::array arr = {1, 2, 3};
 
  
  • 优点:比原生数组更安全,支持迭代器和标准库算法。

13. std::tuple

std::tuple 用于存储多个不同类型的值。

std::tuple t(1, 3.14, "hello");
int x = std::get<0>(t);  // x = 1
 
  
  • 优点:简化多值返回的场景。

14. 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";
 
  
  • 优点:提供高精度的时间测量。

15. override 和 final 关键字

  • override:显式标记重写虚函数。
    class Base {
    public:
        virtual void func() {}
    };
    class Derived : public Base {
    public:
        void func() override {}  // 显式标记重写
    };
     
  • final:禁止类被继承或函数被重写。
    class Base final {};  // 禁止继承
     
  • 优点:提高代码的可读性和安全性。

二、c++11库

1. 智能指针库 ()

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);
     

2. 多线程库 ()

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();  // 获取结果
     

3. 时间库 ()

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";
     

4. 随机数库 ()

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 的随机数
     

5. 正则表达式库 ()

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";
    }
     

6. 无序容器 ()

C++11 引入了基于哈希表的无序容器。

  • std::unordered_map:无序映射。
    std::unordered_map map = {{"apple", 1}, {"banana", 2}};
     
  • std::unordered_set:无序集合。
    std::unordered_set set = {1, 2, 3};
     
  • 优点:提供更高效的查找性能(平均 O(1) 时间复杂度)。

7. 元组库 ()

C++11 提供了元组(std::tuple),用于存储多个不同类型的值。

  • 示例:
    std::tuple t(1, 3.14, "hello");
    int x = std::get<0>(t);  // x = 1
     
  • 优点:简化多值返回的场景。

8. 函数对象库 ()

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
     

9. 数组容器 ()

C++11 提供了固定大小的数组容器 std::array

  • 示例:
    std::array arr = {1, 2, 3};
     
  • 优点:比原生数组更安全,支持迭代器和标准库算法。

10. 原子操作库 ()

C++11 提供了原子操作支持,用于无锁编程。

  • std::atomic:原子类型。
    std::atomic counter(0);
    counter.fetch_add(1);  // 原子操作
     

11. 类型特征库 ()

C++11 提供了类型特征支持,用于编译时类型检查。

  • std::is_integral:检查是否为整数类型。
    static_assert(std::is_integral::value, "Not an integral type");
     
  • std::enable_if:条件编译。
    template::value>>
    void func(T x) {}
     

12. 初始化列表支持 ()

C++11 引入了初始化列表支持。

  • 示例:
    std::vector vec = {1, 2, 3, 4};  // 初始化列表
     

总结

C++11 引入了许多现代编程语言的特性,极大地提升了 C++ 的表达能力和开发效率。掌握这些特性可以帮助开发者编写更高效、更安全的代码。

C++11 的标准库扩展极大地增强了语言的功能性,提供了更现代化的工具和组件。这些库组件与语言特性相结合,使得 C++11 成为一个更强大、更高效的编程语言版本。

你可能感兴趣的:(c++,开发语言)