在C++ STL中,vector
是一个非常重要的容器,它提供了动态数组的功能。以下是 vector
头文件中的一些常用函数及其使用方法和细节,以及在算法竞赛中的使用细节和总结:
1. 构造、析构、赋值
- 构造函数 (
std::vector::vector
): 可以无参数构造一个空的vector
,也可以指定大小或大小和初始值构造。vector<int> v; // 默认构造 vector<int> v(10); // 构造包含10个元素的vector,值未定义 vector<int> v(10, 1); // 构造包含10个元素的vector,每个元素初始化为1 vector<int> v(other.begin(), other.end()); // 构造一个包含other中所有元素的vector
- 析构函数 (
std::vector::~vector
): 销毁vector
,释放所有资源。 - 赋值操作符 (
std::vector::operator=
): 将一个vector
的内容赋值给另一个vector
。vector<int> v1 = {1, 2, 3}; vector<int> v2; v2 = v1; // v2现在包含v1的所有元素
2. Iterators 迭代器
std::vector::begin
: 返回指向vector
开始的迭代器。std::vector::end
: 返回指向vector
结束的迭代器。std::vector::rbegin
和std::vector::rend
: 返回反向迭代器。
3. Capacity 容量
std::vector::size
: 查询vector
的大小。std::vector::max_size
: 查询vector
能容纳的最大元素数量。std::vector::resize
: 改变vector
的大小。v.resize(20); // 将vector大小改为20,超出原大小的元素被默认构造 v.resize(20, 1); // 将vector大小改为20,超出原大小的元素被初始化为1
std::vector::capacity
: 查询vector
的容量。std::vector::empty
: 检查vector
是否为空。std::vector::reserve
: 改变vector
的容量,但不改变其大小。std::vector::shrink_to_fit
: 减小vector
的容量以适应其大小(C++11)。
4. Element access 元素访问
std::vector::operator[]
: 通过下标访问元素。std::vector::at
: 通过下标访问元素,越界时抛出异常。std::vector::front
: 访问第一个元素。std::vector::back
: 访问最后一个元素。std::vector::data
: 获取指向vector
元素的指针(C++11)。
5. Modifiers 内容修改
std::vector::assign
: 替换vector
的所有元素。std::vector::push_back
: 在vector
末尾添加一个元素。std::vector::pop_back
: 删除vector
的最后一个元素。std::vector::insert
: 在指定位置插入元素。v.insert(v.begin() + 1, 5, 50); // 在第二个位置插入5个50 v.insert(v.begin() + 1, {1, 2, 3}); // 在第二个位置插入{1, 2, 3}
std::vector::erase
: 删除指定位置的元素或范围。v.erase(v.begin() + 1); // 删除第二个元素 v.erase(v.begin() + 1, v.begin() + 3); // 删除从第二个到第三个(不包括第三个)的元素
std::vector::swap
: 交换两个vector
的内容。std::vector::clear
: 移除vector
的所有元素。std::vector::emplace
和std::vector::emplace_back
: 构造元素而非复制或移动(C++11)。
算法竞赛中的使用细节和总结
- 性能考虑:
vector
的push_back
和pop_back
操作通常非常快,但如果需要频繁在vector
的中间插入或删除元素,可能会因为需要移动大量元素而导致性能下降。 - 内存管理:
vector
会自动管理内存,但了解其内部的内存分配策略(如何时进行内存重新分配)可以帮助优化性能。 - 空间效率:使用
reserve
可以避免不必要的内存重新分配,提高空间效率。 - 代码简洁:
vector
提供的迭代器和算法使得处理元素集合变得非常简洁。 - 异常安全:在竞赛中,需要考虑代码的异常安全性,
vector
的操作通常是强异常安全的。
官方vector的更加详细的介绍如下
vector - C++ Reference
以上是对 vector
头文件中各种函数的详细介绍和使用方法,以及在算法竞赛中的一些使用细节和总结。希望这些信息能帮助你更好地理解和使用 vector
。