C++容器

本文主要介绍C++容器的常用操作及使用方法

vector

非常常用的容器

1. 基本操作

  • 创建和初始化

    std::vector<int> v;  // 默认空的 vector
    std::vector<int> v(10); // 创建一个大小为 10 的 vector,元素初始化为 0
    std::vector<int> v(10, 5); // 创建一个大小为 10 的 vector,所有元素初始化为 5
    std::vector<int> v = {1, 2, 3, 4}; // 使用列表初始化
  • 获取大小

    size_t size = v.size();  // 获取 vector 的元素个数
  • 判断是否为空

    bool is_empty = v.empty();  // 如果 vector 为空,返回 true
  • 访问元素

    int first = v[0];  // 通过索引访问元素
    int second = v.at(1); // 使用 at() 安全访问(超出范围会抛出异常)
    int last = v.back(); // 获取最后一个元素
    int first_element = v.front(); // 获取第一个元素
  • 添加元素

    v.push_back(10);  // 向 vector 末尾添加元素
    v.push_back(20);
  • 删除元素

    v.pop_back();  // 删除 vector 最后一个元素

2. 插入和删除元素(中间位置)

  • 在指定位置插入元素

    v.insert(v.begin() + 1, 50);  // 在第 1 个位置插入元素 50
    v.insert(v.end(), 100); // 在末尾插入元素 100
  • 插入多个元素

    v.insert(v.begin() + 2, 3, 10);  // 在第 2 个位置插入 3 个元素,每个元素是 10
  • 删除指定位置的元素

    v.erase(v.begin() + 2);  // 删除第 2 个位置的元素
  • 删除一段元素

    v.erase(v.begin() + 1, v.begin() + 3);  // 删除从位置 1 到 2(不包括 3)之间的元素
  • 删除所有元素

    v.clear();  // 清空 vector 所有元素

3. 其他常用操作

  • 交换内容

    std::vector<int> v2 = {10, 20, 30};
    v.swap(v2); // 交换 v 和 v2 中的元素
  • 重新调整大小

    v.resize(15);  // 调整大小为 15,新增的元素默认初始化为 0
    v.resize(10, 100); // 调整大小为 10,新增的元素初始化为 100
  • 保留空间

    v.reserve(20);  // 为 v 保留足够的空间,以避免多次内存重分配
  • 返回存储容量

    size_t capacity = v.capacity();  // 获取当前已分配的内存空间容量

4. 迭代器操作

  • 遍历

    for (auto it = v.begin(); it != v.end(); ++it) {
    std::cout << *it << " ";
    }
    // 或者使用范围 for 循环
    for (auto& elem : v) {
    std::cout << elem << " ";
    }
  • 逆序遍历

    for (auto it = v.rbegin(); it != v.rend(); ++it) {
    std::cout << *it << " ";
    }

5. 排序

  • 使用标准库排序

    std::sort(v.begin(), v.end());  // 升序排序
    std::sort(v.begin(), v.end(), std::greater<int>()); // 降序排序
  • 自定义排序

    std::sort(v.begin(), v.end(), [](int a, int b) {
    return a > b; // 自定义降序
    });

6. 其它有用操作

  • 查找元素

    auto it = std::find(v.begin(), v.end(), 10);  // 查找元素 10 是否在 vector 中
    if (it != v.end()) {
    std::cout << "Found 10 at index: " << std::distance(v.begin(), it) << std::endl;
    }
  • 合并两个 vector

    std::vector<int> v1 = {1, 2, 3};
    std::vector<int> v2 = {4, 5, 6};
    v1.insert(v1.end(), v2.begin(), v2.end()); // 将 v2 的元素添加到 v1 的末尾

for_each

std::for_each 是一个 遍历 容器元素的算法,它对容器中的每一个元素应用给定的操作(通常是一个函数或 lambda 表达式)。它不会返回任何值,主要用来执行副作用操作。

其实也不是绝对的每一个元素,具体是从哪个元素开始到哪个元素结束取决于传进去的迭代器(不过一般都是传begin()end()

示例:

string s = "abcdefg";
for_each(s.begin(), s.end(), [](auto& a) { // 必须传引用不然改不了
a = toupper(a); // 所有元素转大写
});
cout << s << endl;

// 把从包括第三位之后的字符转小写
for_each(s.begin() + 2, s.end(), [](auto& a) {
a = tolower(a);
});
cout << s << endl;

all_of

std::all_of 是一个 条件检查 算法,用于检查容器中的所有元素是否满足某个条件。如果所有元素都满足条件,它返回 true,否则返回 false

同理也不一定是所有元素,取决于传进去的迭代器

示例:

vector<int> arr = {2, 4, 6, 8, 7, 11, 31, 21};
// 判断元素是否都大于10
if (all_of(arr.begin(), arr.end(), [](const auto a) {
return a > 10;
})) {
cout << "true" << endl;
} else {
cout << "false" << endl; // output this
}
// 判断后三个元素是否大于10
if (all_of(arr.end() - 3, arr.end(), [](const auto a) {
return a > 10;
})) {
cout << "true" << endl; // output this
} else {
cout << "false" << endl;
}

any_of

std::any_of: 检查容器中是否 至少有一个 元素满足某个条件

示例:

vector<int> arr = {1, 2, 3, 4, -5, 6, 7, 8};
// 判断容器中是否有负数
cout << any_of(arr.begin(), arr.end(), [](const auto a) {
return a < 0;
}) << endl; // 1

none_of

std::none_of: 检查容器中是否 没有一个 元素满足某个条件

示例:

vector<int> arr = {1, 2, 3, 4, -5, 6, 7, 8};
// 判断容器中是否没有有负数
cout << none_of(arr.begin(), arr.end(), [](const auto a) {
return a < 0;
}) << endl; // 0

find_if

std::find_if: 查找容器中 第一个满足条件 的元素

*注:*找到的一定是第一个满足条件的

示例:

vector<int> arr = {1, 2, 3, 4, -5, 6, 7, -8};
// 找第一个负数
auto it = find_if(arr.begin(), arr.end(), [](const auto a) {
return a < 0;
});
if (it != arr.end()) {
cout << *it << endl; // -5
}

count_if

std::count_if: 统计容器中 满足条件的元素数量

示例:

vector<int> arr = {1, 2, 3, 4, -5, 6, 7, -8};
// 统计所有负数的数量
cout << count_if(arr.begin(), arr.end(), [](const auto a) {
return a < 0;
}) << endl; // 2