往期汇总:
C++STL(1) vector容器汇总
C++STL(2) list容器汇总
C++STL(3) queue容器汇总
C++STL(4) stack容器汇总
C++STL(5) set容器汇总
C++STL(6) map容器汇总
C++STL(7) unordered_map容器汇总
C++STL(1) vector容器汇总
一、概述
std::vector
是C++
标准库中的一个容器,它提供了动态数组的功能。它是一个模板类,可以存储不同类型的元素,并且可以根据需要自动调整大小。std::vector
是C++
中最常用的容器之一,因为它具有灵活性、高效性和易用性。
二、详细介绍及用法
下面是一些关于std::vector
的详细介绍:
-
. 头文件和命名空间:使用
std::vector
需要包含头文件<vector>
,并使用std
命名空间。例如:#include <vector>
和using namespace std;
。 -
. 声明和初始化:可以使用
std::vector
模板类声明一个向量,并通过不同的方式进行初始化。例如:
std::vector<int> vec; // 声明一个整型向量
std::vector<double> vec2(5); // 声明一个具有5个元素的双精度浮点型向量
std::vector<std::string> vec3 = {"apple", "banana", "orange"}; // 声明并初始化一个字符串向量
std::vector<int>b(10, 1);//定义了一个长度为十的整形变量,值为1
std::vector<int>c(b);//用向量来创造向量,整体复制性赋值
std::vector<int>d(b.begin(), b.begin() + 3);//定义了d值为b的第 0个元素到第二个元素
int e[5]={1,2,3,4,5};
std::vector<int>f(e, e + 5);//从数组中获得初值
- . 添加和访问元素:可以使用
push_back()
方法将元素添加到向量的末尾,也可以使用下标操作符[]
访问指定位置的元素。例如:
vec.push_back(10); // 添加元素到向量末尾
int value = vec[0]; // 访问向量中的第一个元素
- . 获取向量大小:可以使用
size()
方法获取向量中的元素数量。例如:
int size = vec.size(); // 获取向量的大小
- . 遍历向量:可以使用循环结构(如
for
循环或迭代器)遍历向量中的元素。例如:
for (int i = 0; i < vec.size(); i++) {
std::cout << vec[i] << " ";
}
- . 动态调整大小:
std::vector
可以根据需要自动调整大小。当向量的元素数量超过当前容量时,向量会自动重新分配更大的内存空间,以容纳更多的元素。例如:
vec.resize(10); // 调整向量的大小为10,多余的元素会用默认值进行填充
- . 插入元素:可以使用
insert()
方法在指定位置插入一个或多个元素。例如:
std::vector<int> vec = {1, 2, 3, 4};
vec.insert(vec.begin() + 2, 10); // 在索引为2的位置插入元素10
vec.insert(vec.begin() + 3, 2, 20); // 在索引为3的位置插入两个元素20
- . 删除元素:可以使用
erase()
方法删除指定位置的一个或多个元素。例如:
std::vector<int> vec = {1, 2, 3, 4};
vec.erase(vec.begin() + 1); // 删除索引为1的元素
vec.erase(vec.begin() + 2, vec.begin() + 4); // 删除索引为2到3的元素
- . 清空向量:可以使用
clear()
方法清空向量中的所有元素。例如:
std::vector<int> vec = {1, 2, 3, 4};
vec.clear(); // 清空向量中的所有元素
- . 获取首尾元素:可以使用
front()
和back()
方法分别获取向量的第一个和最后一个元素。例如:
std::vector<int> vec = {1, 2, 3, 4};
int first = vec.front(); // 获取第一个元素
int last = vec.back(); // 获取最后一个元素
- . 判断向量是否为空:可以使用
empty()
方法检查向量是否为空,返回一个布尔值。例如:
std::vector<int> vec = {1, 2, 3, 4};
bool isEmpty = vec.empty(); // 检查向量是否为空
- . 访问迭代器:可以使用迭代器来遍历向量或访问元素。例如:
std::vector<int> vec = {1, 2, 3, 4};
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
- . 获取迭代器:可以使用
begin()
和end()
方法获取指向向量开头和结尾的迭代器。例如:
std::vector<int> vec = {1, 2, 3, 4};
std::vector<int>::iterator it = vec.begin(); // 获取向量的起始迭代器
std::vector<int>::iterator endIt = vec.end(); // 获取向量的结束迭代器
- . 反向遍历:可以使用
rbegin()
和rend()
方法从向量的末尾开始反向遍历。例如:
std::vector<int> vec = {1, 2, 3, 4};
for (std::vector<int>::reverse_iterator rit = vec.rbegin(); rit != vec.rend(); ++rit) {
std::cout << *rit << " ";
}
- . 交换向量:可以使用
swap()
方法交换两个向量的内容。例如:
std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2 = {4, 5, 6};
vec1.swap(vec2); // 交换vec1和vec2的内容
- . 获取容量:可以使用
capacity()
方法获取向量的当前容量,即它可以容纳的元素数量。例如:
std::vector<int> vec = {1, 2, 3};
int capacity = vec.capacity(); // 获取向量的容量
- . 重新分配内存:可以使用
reserve()
方法预留一定数量的内存空间,以避免频繁的重新分配。例如:
std::vector<int> vec;
vec.reserve(100); // 预留100个元素的内存空间
- . 使用自定义比较函数排序:可以使用
sort()
方法对向量进行排序,并通过自定义的比较函数指定排序顺序。例如:
bool compare(int a, int b) {
return a > b; // 自定义比较函数,按降序排序
}
std::vector<int> vec = {3, 1, 4, 2};
std::sort(vec.begin(), vec.end(), compare); // 使用自定义比较函数排序
- . 查找元素:可以使用
std::find()
算法函数在向量中查找指定的元素。例如:
std::vector<int> vec = {1, 2, 3, 4};
std::vector<int>::iterator it = std::find(vec.begin(), vec.end(), 3); // 查找元素3
if (it != vec.end()) {
// 元素找到
} else {
// 元素未找到
}
- . 替换元素:可以使用
std::replace()
算法函数将向量中的指定元素替换为新的元素值。例如:
std::vector<int> vec = {1, 2, 3, 2, 4};
std::replace(vec.begin(), vec.end(), 2, 5); // 将元素2替换为5
- . 计数元素:可以使用
std::count()
算法函数计算向量中指定元素的出现次数。例如:
std::vector<int> vec = {1, 2, 3, 2, 4};
int count = std::count(vec.begin(), vec.end(), 2); // 计算元素2的出现次数
- . 部分排序:可以使用
std::partial_sort()
算法函数对向量的一部分元素进行排序。例如:
std::vector<int> vec = {4, 2, 1, 3, 5};
std::partial_sort(vec.begin(), vec.begin() + 3, vec.end()); // 将前3个元素进行排序
- . 截取子向量:可以使用
std::vector
的构造函数和迭代器来截取原始向量的一部分,创建一个新的子向量。例如:
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int> subVec(vec.begin() + 1, vec.begin() + 4); // 截取索引1到3的元素,创建子向量
- . 逆转向量:可以使用
std::reverse()
算法函数将向量中的元素进行逆序排列。例如:
std::vector<int> vec = {1, 2, 3, 4, 5};
std::reverse(vec.begin(), vec.end()); // 将向量中的元素逆序排列
三、排序(其实会前两个就可以了,hh)
- . std::sort():对向量中的元素进行升序/降序排序。例如:
std::vector<int> vec = {4, 2, 1, 3, 5};
std::sort(vec.begin(), vec.end()); //升序排序
std:sort(vec.begin(), vec.end(), greater<int>()); //降序排序
- . std::partial_sort():对向量中的部分元素进行排序,使得指定范围内的元素处于升序排列,而其余元素的顺序不确定。例如:
std::vector<int> vec = {4, 2, 1, 3, 5};
std::partial_sort(vec.begin(), vec.begin() + 3, vec.end());
- . std::nth_element():对向量中的元素进行部分排序,使得第n个元素处于正确的位置,而不关心其他元素的顺序。例如:
std::vector<int> vec = {4, 2, 1, 3, 5};
std::nth_element(vec.begin(), vec.begin() + 2, vec.end());
- . std::stable_sort():对向量中的元素进行升序排序,保持相等元素的相对顺序不变。例如:
std::vector<int> vec = {4, 2, 1, 3, 5};
std::stable_sort(vec.begin(), vec.end());
- . std::partial_sort_copy():将向量中的元素的部分排序结果存储到另一个向量中。例如:
std::vector<int> vec = {4, 2, 1, 3, 5};
std::vector<int> result(3);
std::partial_sort_copy(vec.begin(), vec.end(), result.begin(), result.end());
这些排序算法函数提供了不同的排序方式和灵活性,可以根据具体需求选择适当的函数。请注意,这些函数都需要包含头文件<algorithm>
。
四、结语
std::vector
是C++
标准库的一部分,您可以在C++
官方文档中找到有关std::vector
的详细信息。以下是C++
官方文档的网址:
官方文档
在该网址上,您可以找到有关std::vector
的完整文档,包括类定义、成员函数、操作示例以及与其他容器的比较等内容。该文档提供了对std::vector
的广泛覆盖,以及对每个成员函数的详细描述和用法示例。
请注意,该文档是英文文档。
会陆续把常用容器的常用函数总结成分享的,hh