c++++标准库中的vector、map和set分别适用于动态数组、键值对存储和唯一元素集合场景。1. vector支持动态大小数组,常用操作包括push_back、emplace_back添加元素,at或下标访问,erase删除元素,reserve预分配内存而不改变大小,resize则改变元素数量并初始化;2. map基于红黑树实现,键唯一且有序,通过insert、emplace插入,find查找,erase删除,支持自定义排序如使用函数对象或lambda表达式;3. set存储唯一有序元素,操作与map类似,插入重复元素会被忽略;4. 选择容器时,若需随机访问和尾部操作选vector,若需键值对且有序选map,若需快速查找唯一元素且有序选set;5. 对性能要求高且无需排序时,可选用unordered_map或unordered_set,其基于哈希表,平均查找时间复杂度为o(1);6. 自定义排序需满足严格弱排序规则,可通过函数对象、lambda或函数指针实现。正确选择容器能显著提升程序效率和代码质量。
C++标准库容器
vector
map
set
解决方案
vector
map
set
立即学习“C++免费学习笔记(深入)”;
vector
map
set
以下是一些核心操作的示例和解释:
vector
包含头文件:
#include <vector>
创建 vector
std::vector<int> myVector; // 创建一个存储int类型的空vector std::vector<int> myVector2(10); // 创建一个包含10个int元素的vector,默认值为0 std::vector<int> myVector3(10, 5); // 创建一个包含10个int元素的vector,每个元素的值为5 std::vector<int> myVector4 = {1, 2, 3, 4, 5}; // 使用初始化列表
添加元素:
myVector.push_back(10); // 在vector末尾添加一个元素 myVector.emplace_back(20); // 类似于push_back,但是更高效,尤其是在添加对象时
访问元素:
int firstElement = myVector[0]; // 使用下标访问(不进行边界检查) int secondElement = myVector.at(1); // 使用at()访问(进行边界检查,越界会抛出异常) int lastElement = myVector.back(); // 访问最后一个元素 int* dataPtr = myVector.data(); // 获取指向内部数组的指针(C++11)
删除元素:
myVector.pop_back(); // 删除最后一个元素 myVector.erase(myVector.begin() + 2); // 删除索引为2的元素 myVector.erase(myVector.begin(), myVector.begin() + 3); // 删除一个范围内的元素 myVector.clear(); // 删除所有元素
大小和容量:
size_t size = myVector.size(); // 获取vector中元素的数量 size_t capacity = myVector.capacity(); // 获取vector分配的内存大小 myVector.reserve(100); // 预分配100个元素的空间,避免频繁重新分配 myVector.shrink_to_fit(); // 释放多余的内存空间(C++11)
迭代:
for (size_t i = 0; i < myVector.size(); ++i) { std::cout << myVector[i] << " "; } for (auto it = myVector.begin(); it != myVector.end(); ++it) { std::cout << *it << " "; } for (int element : myVector) { // 范围for循环 (C++11) std::cout << element << " "; }
map
包含头文件:
#include <map>
创建 map
std::map<std::string, int> myMap; // 创建一个键为string,值为int的map std::map<int, std::string, std::greater<int>> myMap2; // 创建一个键为int,值为string的map,并使用std::greater<int>排序(降序)
插入元素:
myMap["apple"] = 1; // 使用下标插入 myMap.insert({"banana", 2}); // 使用insert插入pair myMap.emplace("cherry", 3); // 使用emplace直接构造元素(更高效)
访问元素:
int appleCount = myMap["apple"]; // 使用下标访问(如果键不存在,会插入一个默认值) int bananaCount = myMap.at("banana"); // 使用at()访问(如果键不存在,会抛出异常)
查找元素:
auto it = myMap.find("apple"); if (it != myMap.end()) { std::cout << "Found apple: " << it->second << std::endl; } else { std::cout << "Apple not found" << std::endl; }
删除元素:
myMap.erase("apple"); // 删除键为"apple"的元素 myMap.erase(myMap.find("banana")); // 使用迭代器删除元素 myMap.clear(); // 删除所有元素
大小:
size_t size = myMap.size(); // 获取map中元素的数量
迭代:
for (auto it = myMap.begin(); it != myMap.end(); ++it) { std::cout << it->first << ": " << it->second << std::endl; } for (auto const& [key, val] : myMap) { // 范围for循环 (C++17) std::cout << key << ": " << val << std::endl; }
set
包含头文件:
#include <set>
创建 set
std::set<int> mySet; // 创建一个存储int类型的set std::set<int, std::greater<int>> mySet2; // 创建一个存储int类型的set,并使用std::greater<int>排序(降序)
插入元素:
mySet.insert(10); mySet.insert(20); mySet.insert(10); // 插入重复元素会被忽略 mySet.emplace(30); // 使用emplace直接构造元素(更高效)
查找元素:
auto it = mySet.find(20); if (it != mySet.end()) { std::cout << "Found 20" << std::endl; } else { std::cout << "20 not found" << std::endl; }
删除元素:
mySet.erase(20); // 删除值为20的元素 mySet.erase(mySet.find(30)); // 使用迭代器删除元素 mySet.clear(); // 删除所有元素
大小:
size_t size = mySet.size(); // 获取set中元素的数量
迭代:
for (auto it = mySet.begin(); it != mySet.end(); ++it) { std::cout << *it << " "; } for (int element : mySet) { // 范围for循环 (C++11) std::cout << element << " "; }
选择容器取决于你的具体需求。
vector
vector
map
map
map
set
set
set
set
如果需要保持插入顺序,
std::unordered_map
std::unordered_set
vector
reserve
resize
reserve
resize
vector
reserve(n)
n
vector
size
vector
reserve
vector
resize(n)
vector
size
n
n
n
resize
vector
何时使用?
vector
reserve
vector
resize
举例:
std::vector<int> myVector; myVector.reserve(100); // 预分配100个int的空间,size仍然为0 for (int i = 0; i < 100; ++i) { myVector.push_back(i); // 添加元素,不会触发重新分配 } std::vector<int> myVector2; myVector2.resize(100); // size变为100,所有元素初始化为0 for (int i = 0; i < myVector2.size(); ++i) { myVector2[i] = i; // 可以直接通过下标访问元素 }
map
unordered_map
map
unordered_map
map
map
map
unordered_map
unordered_map
如何选择?
map
unordered_map
map
unordered_map
unordered_map
总的来说,
unordered_map
map
map
set
unordered_set
set
unordered_set
map
unordered_map
set
unordered_set
如何选择?
set
unordered_set
选择原则与
map
unordered_map
set
map
可以通过以下几种方式自定义排序规则:
函数对象 (Functor): 创建一个类,重载
operator()
struct MyComparator { bool operator()(const int& a, const int& b) const { return a > b; // 降序排列 } }; std::set<int, MyComparator> mySet; std::map<int, std::string, MyComparator> myMap;
Lambda 表达式 (C++11): 使用 lambda 表达式定义比较函数。
auto myComparator = [](const int& a, const int& b) { return a > b; // 降序排列 }; std::set<int, decltype(myComparator)> mySet(myComparator); std::map<int, std::string, decltype(myComparator)> myMap(myComparator);
函数指针: 定义一个函数,然后将函数指针传递给
set
map
无论使用哪种方式,比较函数都必须满足严格弱排序 (strict weak ordering) 的要求。这意味着对于任意元素 a, b, c:
comp(a, a)
false
comp(a, b)
true
comp(b, a)
false
comp(a, b)
true
comp(b, c)
true
comp(a, c)
true
不满足严格弱排序会导致未定义行为。
以上就是怎样使用C++标准库容器 vector map set核心操作的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号