C++ STL中的vector
vector
是C++标准模板库(STL)中最常用的序列容器之一,它是一个动态数组,能够存储任意类型的对象(如整数、字符串等)。vector
的主要优点是提供了快速的随机访问,同时还能够动态地调整大小。
基本操作
-
创建和初始化
#include <vector> std::vector<int> v1; // 创建一个空的vector std::vector<int> v2(5, 10); // 创建一个大小为5的vector,每个元素初始化为10 std::vector<int> v3 = {1, 2, 3, 4, 5}; // 初始化列表
-
访问元素
at(index)
和operator[]
:访问指定位置的元素,at
会检查索引范围。front()
和back()
:访问第一个和最后一个元素。
int first = v3.front(); // 1 int last = v3.back(); // 5 int element = v3.at(2); // 3
-
修改元素
push_back(value)
:在vector的末尾添加一个元素。pop_back()
:移除vector的最后一个元素。insert(position, value)
:在指定位置插入一个元素。erase(position)
或erase(start, end)
:删除一个或多个元素。clear()
:清空所有元素。
v3.push_back(6); // v3: {1, 2, 3, 4, 5, 6} v3.pop_back(); // v3: {1, 2, 3, 4, 5} v3.insert(v3.begin() + 2, 99); // v3: {1, 2, 99, 3, 4, 5} v3.erase(v3.begin() + 2); // v3: {1, 2, 3, 4, 5}
-
大小和容量
size()
:返回当前元素的数量。capacity()
:返回vector在不重新分配内存的情况下可以存储的元素数量。resize(n)
:改变vector的大小,多出的元素会被初始化。reserve(n)
:增加vector的容量。
size_t num_elements = v3.size(); // 5 size_t capacity = v3.capacity(); v3.reserve(10);
-
遍历
- 使用范围
for
循环或迭代器。
for (int x : v3) std::cout << x << " "; for (auto it = v3.begin(); it != v3.end(); ++it) std::cout << *it << " ";
- 使用范围
相关算法
vector
可以与STL中的算法库配合使用,提供强大的数据处理能力。
-
排序
#include <algorithm> std::sort(v3.begin(), v3.end()); // 默认升序排序
-
查找
auto it = std::find(v3.begin(), v3.end(), 3); if (it != v3.end()) {std::cout << "Element found: " << *it << std::endl; }
-
计数
int count = std::count(v3.begin(), v3.end(), 3);
-
删除特定元素
v3.erase(std::remove(v3.begin(), v3.end(), 3), v3.end());
-
遍历并执行操作
std::for_each(v3.begin(), v3.end(), [](int& x){ x *= 2; });
删除特定元素代码是C++中使用的一种常见技术,结合了std::remove
算法和erase
成员函数来从容器中删除特定的元素。这种技术通常被称为“擦除-删除”惯用法(Erase-Remove Idiom)。下面是详细解释:
分解代码
d3.erase(std::remove(d3.begin(), d3.end(), 3), d3.end());
-
std::remove(d3.begin(), d3.end(), 3)
std::remove
是一个算法,它接受三个参数:开始迭代器、结束迭代器和要删除的值(这里是3)。- 这个函数并不实际从容器中删除元素,而是将不等于3的元素向容器的开始位置移动,并返回一个新的迭代器,指向移动后容器中最后一个有效元素之后的位置。
- 也就是说,所有的3都被移到了容器的末尾,并且函数返回了一个指向第一个3的迭代器。
-
d3.erase(new_end, d3.end())
erase
是一个成员函数,用于从容器中实际删除元素。它接受两个迭代器作为参数:要删除的元素范围的开始和结束。- 在这里,
erase
函数使用从std::remove
返回的迭代器(指向第一个3)作为起始位置,到容器的结束位置d3.end()
作为结束位置。 - 这个调用将删除所有的3,因为这些3现在都位于这个范围内。
效果
这行代码的效果是从容器d3
中删除所有值为3的元素。这种方法比单独使用循环和条件删除更高效,因为它只需要一次遍历和少量的元素移动。
注意
- 这种方法适用于支持快速随机访问的容器,如
vector
、deque
、array
等。对于list
或forward_list
这类容器,应使用成员函数remove
,因为它们提供了更为优化的删除操作。 - 使用
std::remove
时,容器的大小不会改变,只是元素的位置发生了变化,因此需要与erase
结合使用来实际减少容器的大小。