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结合使用来实际减少容器的大小。