std::vector
是 C++ 标准库中的一个动态数组容器,提供了丰富的接口来管理容量、插入、删除和访问元素。以下是对你提到的接口的详细说明和使用示例:
1. 容量相关接口
capacity()
: 返回当前vector
分配的存储空间大小(以元素数量计),即在不重新分配内存的情况下可以容纳的元素数量。std::vector<int> vec; vec.reserve(100); // 预留 100 个元素的空间 std::cout << "Capacity: " << vec.capacity() << std::endl; // 输出: Capacity: 100
reserve(size_type n)
: 预留至少能容纳n
个元素的内存空间。如果n
大于当前容量,vector
会重新分配内存以增加容量。std::vector<int> vec; vec.reserve(100); // 预留 100 个元素的空间
shrink_to_fit()
: 请求移除未使用的容量,使capacity()
等于size()
。这个请求是非强制的,具体实现可能会忽略。std::vector<int> vec(100); vec.resize(10); // 缩小 size 到 10 vec.shrink_to_fit(); // 请求缩小容量 std::cout << "Capacity after shrink: " << vec.capacity() << std::endl; // 输出: Capacity after shrink: 10
2. 附加元素接口
push_back(const T& value)
: 在vector
的末尾添加一个元素。std::vector<int> vec; vec.push_back(10); // vec: [10] vec.push_back(20); // vec: [10, 20]
emplace_back(Args&&... args)
: 在vector
的末尾就地构造一个元素,避免了不必要的拷贝或移动操作。std::vector<std::string> vec; vec.emplace_back("Hello"); // vec: ["Hello"] vec.emplace_back("World"); // vec: ["Hello", "World"]
3. 元素插入接口
insert(iterator pos, const T& value)
: 在指定位置pos
前插入一个元素。std::vector<int> vec = {1, 3}; vec.insert(vec.begin() + 1, 2); // vec: [1, 2, 3]
emplace(iterator pos, Args&&... args)
: 在指定位置pos
前就地构造一个元素。std::vector<std::string> vec = {"Hello", "World"}; vec.emplace(vec.begin() + 1, "C++"); // vec: ["Hello", "C++", "World"]
4. 元素删除接口
pop_back()
: 删除vector
的最后一个元素。std::vector<int> vec = {1, 2, 3}; vec.pop_back(); // vec: [1, 2]
erase(iterator pos)
: 删除指定位置pos
的元素。std::vector<int> vec = {1, 2, 3}; vec.erase(vec.begin() + 1); // vec: [1, 3]
erase(iterator first, iterator last)
: 删除范围[first, last)
内的元素。std::vector<int> vec = {1, 2, 3, 4}; vec.erase(vec.begin() + 1, vec.begin() + 3); // vec: [1, 4]
clear()
: 清空vector
中的所有元素。std::vector<int> vec = {1, 2, 3}; vec.clear(); // vec: []
5. 元素访问接口
operator[]
: 通过下标访问元素,不进行边界检查。std::vector<int> vec = {1, 2, 3}; int x = vec[1]; // x = 2
at(size_type pos)
: 通过下标访问元素,进行边界检查,如果pos
超出范围则抛出std::out_of_range
异常。std::vector<int> vec = {1, 2, 3}; int x = vec.at(1); // x = 2
front()
: 返回vector
的第一个元素。std::vector<int> vec = {1, 2, 3}; int x = vec.front(); // x = 1
back()
: 返回vector
的最后一个元素。std::vector<int> vec = {1, 2, 3}; int x = vec.back(); // x = 3
data()
: 返回指向vector
内部数组的指针。std::vector<int> vec = {1, 2, 3}; int* p = vec.data(); // p 指向 vec 的内部数组
6. 容量相关
empty()
: 判断vector
是否为空。std::vector<int> vec; if (vec.empty()) { std::cout << "Vector is empty" << std::endl; }
size()
: 返回vector
中当前元素的数量。std::vector<int> vec = {1, 2, 3}; std::cout << "Size: " << vec.size() << std::endl; // 输出: Size: 3
max_size()
: 返回vector
可以容纳的最大元素数量。std::vector<int> vec; std::cout << "Max size: " << vec.max_size() << std::endl;
总结
std::vector
提供了丰富的接口来管理动态数组的容量、插入、删除和访问元素。合理使用这些接口可以有效地管理内存并提高代码的性能。