常见容器
- `std::vector` 操作
- `std::map` 操作
- `std::set` 操作
- `std::pair` 操作
std::vector
操作
- 创建和初始化:
std::vector<int> vec1; // 空 vector std::vector<int> vec2(5, 10); // 5 个元素,每个为 10 std::vector<int> vec3 = {1, 2, 3};
- 插入和删除:
vec1.push_back(1); // 末尾插入 vec1.pop_back(); // 删除末尾元素 vec1.insert(vec1.begin(), 5); // 插入到指定位置 vec1.erase(vec1.begin()); // 删除指定位置 vec1.clear(); // 清空
- 访问元素:
int val = vec1[0]; // 索引访问 int val2 = vec1.at(1); // 使用 `at()` int front = vec1.front(); // 第一个元素 int back = vec1.back(); // 最后一个元素
- 大小和容量:
int size = vec1.size(); int capacity = vec1.capacity(); vec1.resize(10); // 调整大小 vec1.shrink_to_fit(); // 释放多余内存
- 遍历:
for (int val : vec1) { /* 遍历元素 */ }
std::map
操作
- 创建和初始化:
std::map<int, std::string> map1; std::map<int, std::string> map2 = {{1, "One"}, {2, "Two"}};
- 插入和删除:
map1[1] = "One"; // 插入或更新 map1.insert({2, "Two"}); // 插入 map1.emplace(3, "Three"); // 原地插入 map1.erase(2); // 删除键为 2 的元素 map1.clear(); // 清空
- 访问元素:
std::string val = map1[1]; // 使用 `[]` std::string val2 = map1.at(2); // 使用 `at()`
- 查找:
auto it = map1.find(2); bool exists = (map1.count(2) > 0);
- 大小:
int size = map1.size(); bool isEmpty = map1.empty();
std::set
操作
- 创建和初始化:
std::set<int> set1; std::set<int> set2 = {1, 2, 3};
- 插入和删除:
set1.insert(1); // 插入 set1.erase(2); // 删除 set1.clear(); // 清空
- 查找:
auto it = set1.find(2); bool exists = (set1.count(2) > 0);
- 大小:
int size = set1.size(); bool isEmpty = set1.empty();
std::pair
操作
- 创建和初始化:
std::pair<int, std::string> p1; std::pair<int, std::string> p2(1, "One"); auto p3 = std::make_pair(2, "Two");
- 访问元素:
int first = p2.first; std::string second = p2.second;
以上是 vector
、map
、set
和 pair
的常用操作的精简版。
具体示例代码:
1. Vector
#include <iostream>
#include <vector>
#include <algorithm> // std::find 和 std::remove
int main() {
// 初始化一个 vector
std::vector<int> vec1 = {1, 2, 3, 4, 5};
// 使用迭代器范围初始化另一个 vector(深拷贝)
std::vector<int> vec2(vec1.begin(), vec1.end());
// 插入元素
vec2.push_back(6); // 在末尾插入元素 6
// 查找元素,使用迭代器来查找
auto it = std::find(vec2.begin(), vec2.end(), 3); // 查找元素 3
if (it != vec2.end()) {
vec2.erase(it); // 删除找到的元素 3
}
// 直接删除特定元素
vec2.erase(std::remove(vec2.begin(), vec2.end(), 2), vec2.end()); // 删除所有值为 2 的元素
// 打印 vector 中的所有元素
for (int val : vec2) {
std::cout << val << " "; // 输出: 1 4 5 6
}
return 0;
}
find(vec.begin(),vec.end(),value);
vec.erase(it);
- - - - - - - - - - - - -
2.Set
#include <iostream>
#include <set>
int main() {
// 初始化一个 set
std::set<int> s1 = {1, 2, 3, 4, 5};
// 使用迭代器范围初始化另一个 set
std::set<int> s2(s1.begin(), s1.end());
// 插入元素
s2.insert(6); // 插入元素 6
// 查找元素
auto it = s2.find(3); // 查找元素 3,返回迭代器
if (it != s2.end()) {
s2.erase(it); // 删除找到的元素 3
}
// 直接删除特定元素
s2.erase(2); // 删除元素 2
// 打印 set 中的所有元素
for (int val : s2) {
std::cout << val << " "; // 输出: 1 4 5 6
}
return 0;
}
set.insert();
set.count();
set.erase();
- - - - - - - - - - - - -
3.Map
#include <iostream>
#include <map>
int main() {
// 初始化一个 map
std::map<int, std::string> m1 = {{1, "one"}, {2, "two"}, {3, "three"}};
// 使用迭代器范围初始化另一个 map
std::map<int, std::string> m2(m1.begin(), m1.end());
// 插入元素
m2.insert({4, "four"}); // 插入键值对 (4, "four")
m2[5] = "five"; // 插入或更新键值对 (5, "five")
// 查找元素
auto it = m2.find(3); // 查找键为 3 的元素
if (it != m2.end()) {
m2.erase(it); // 删除键为 3 的元素
}
// 直接删除特定键
m2.erase(2); // 删除键为 2 的元素
// 打印 map 中的所有键值对
for (const auto& [key, value] : m2) {
std::cout << key << ": " << value << " "; // 输出: 1: one 4: four 5: five
}
return 0;
}
map.insert(make_pair(v1,v2));
map.erase(it);
auto it = map.find(key);
it->first; it->second;
- - - - - - - - - - - - -
4.Pair
#include <iostream>
#include <utility> // std::pair
int main() {
// 创建一个 pair
std::pair<int, std::string> p1(1, "one");
// 访问 pair 的元素
std::cout << "First: " << p1.first << ", Second: " << p1.second << std::endl; // 输出: First: 1, Second: one
// 修改 pair 的元素
p1.first = 2;
p1.second = "two";
std::cout << "First: " << p1.first << ", Second: " << p1.second << std::endl; // 输出: First: 2, Second: two
// 通过 make_pair 创建一个 pair
auto p2 = std::make_pair(3, "three");
std::cout << "First: " << p2.first << ", Second: " << p2.second << std::endl; // 输出: First: 3, Second: three
return 0;
}
make_pair(v1,v2);
pair.fisrt,pair.second;
总结
vector:支持动态大小和随机访问,适合需要连续存储的场景。
set:有序且唯一的元素集合,适合需要高效查找的场景。
pair:简单的二元数据结构,用于存储相关联的两个值。
map:有序键值对集合,适合快速查找和插入操作的场景。
我在写Leetcode时经常忘记这些容器的用法,其他的容器如list,stack,queue不是很常用,故仅总结出上面四个常用容器,以便速查。