深入浅出 C++ 标准库

深入浅出 C++ 标准库

1. 什么是 C++ 标准库?

C++ 标准库就像是一个内置的工具箱,里面装满了写代码常用的工具,比如:

  • 处理字符串std::string
  • 读写文件std::ifstream
  • 管理动态数组std::vector
  • 智能指针std::shared_ptr
  • 排序、查找算法std::sortstd::find

它和 Java 的 java.util、Python 的 built-in 库类似,但 C++ 的标准库更底层、更高效。


2. 为什么需要 std::

C++ 标准库的所有工具都放在一个叫 std(Standard 的缩写)的工具箱 里。

你要用里面的工具,就得告诉编译器:"我要用 std 工具箱里的东西!"

举个例子:

  • Java 写法(自动找包):

    java 复制代码
    import java.util.ArrayList; // 引入 ArrayList
    ArrayList<String> list = new ArrayList<>(); // 直接用
  • C++ 写法(必须指定工具箱):

    cpp 复制代码
    #include <vector>          // 引入 vector
    std::vector<std::string> list; // 必须加 std::

为什么 C++ 要这么麻烦?

因为 C++ 允许你自己造一个 vector,如果不加 std::,编译器不知道你要用标准库的 vector 还是自己写的 vector


3. 标准库里有哪些常用工具?

(1) 字符串处理(std::string

作用 :比 C 语言的 char[] 更好用,支持动态扩容、查找、拼接等。
示例

cpp 复制代码
#include <string>
std::string name = "张三";
name += " 你好!"; // 直接拼接
int len = name.length(); // 获取长度

(2) 动态数组(std::vector

作用 :类似 Java 的 ArrayList,自动扩容的数组。
示例

cpp 复制代码
#include <vector>
std::vector<int> nums = {1, 2, 3};
nums.push_back(4); // 添加元素
int first = nums[0]; // 访问元素

(3) 哈希表(std::unordered_map

作用 :类似 Java 的 HashMap,快速查找键值对。
示例

cpp 复制代码
#include <unordered_map>
std::unordered_map<std::string, int> scores = {{"Alice", 90}, {"Bob", 80}};
scores["Charlie"] = 85; // 添加键值对
int bobScore = scores["Bob"]; // 查找

(4) 智能指针(std::shared_ptr

作用 :自动管理内存,避免内存泄漏(比 new/delete 更安全)。
示例

cpp 复制代码
#include <memory>
auto ptr = std::make_shared<int>(42); // 创建一个智能指针
*ptr = 100; // 使用方式和普通指针一样
// 不用手动 delete,内存会自动释放!

(5) 文件读写(std::fstream

作用 :读写文件,比 C 语言的 FILE* 更安全。
示例

cpp 复制代码
#include <fstream>
std::ofstream file("test.txt"); // 写文件
file << "Hello, C++!" << std::endl;
file.close();

(6) 算法(std::sortstd::find

作用 :提供常用算法,如排序、查找。
示例

cpp 复制代码
#include <algorithm>
std::vector<int> nums = {3, 1, 4, 1, 5};
std::sort(nums.begin(), nums.end()); // 排序
auto it = std::find(nums.begin(), nums.end(), 4); // 查找

4. 怎么减少 std:: 的重复书写?

如果你觉得每次写 std:: 太麻烦,可以用 using 声明:

(1) 只引入某个工具

cpp 复制代码
#include <string>
using std::string; // 只引入 string

string name = "Alice"; // 现在不用写 std:: 了

(2) 引入整个工具箱(慎用!)

cpp 复制代码
#include <iostream>
using namespace std; // 引入整个 std 工具箱

cout << "Hello" << endl; // 不用写 std::

⚠️ 风险 :如果自己写的类和标准库重名(比如你自己写了个 vector),会冲突!


5. 最佳实践

  1. 在小型项目里 :可以用 using namespace std 偷懒。

  2. 在大型项目/头文件里 :老老实实写 std::,避免命名冲突。

  3. 推荐写法

    cpp 复制代码
    #include <vector>
    using std::vector; // 只引入需要的
    
    vector<int> nums = {1, 2, 3}; // 既清晰又安全

总结

  • C++ 标准库:一个内置的工具箱,提供字符串、容器、算法等常用功能。
  • std:::告诉编译器"我要用标准库的东西"。
  • using :可以少写 std::,但要小心命名冲突。
  • 常用工具
    • std::string(字符串)
    • std::vector(动态数组)
    • std::unordered_map(哈希表)
    • std::shared_ptr(智能指针)
    • std::sort(排序算法)

记住:C++ 标准库就像瑞士军刀,功能强大,但要用对方法! 🔧

相关推荐
Kapaseker2 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴2 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭12 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab13 小时前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe18 小时前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农1 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少1 天前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker1 天前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋1 天前
Android 协程时代,Handler 应该退休了吗?
android
火柴就是我2 天前
让我们实现一个更好看的内部阴影按钮
android·flutter