引入
在编程中,Vector 通常指动态数组,能够自动调整大小以适应元素的增减。
c++ 中,vector 是一个十分有用的容器,它能够像容器一样存放各种类型 的对象。也就是说,vector是一个 能够存放任意类型的动态数组。
一个容器中的所有对象 都必须是同一种类型的。
- Vector 的特点:
- 动态大小:Vector 可以根据需要自动扩展或收缩容量。
- 连续存储:元素在内存中是连续存储 的,支持快速随机访问。
- 高效操作:在末尾插入或删除元素的时间复杂度为 O(1),但在中间或开头操作可能需要 O(n)。
第2、3条特点都与数组相同,唯一不同就是vector容量自动调整,是动态的。
vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和 string 对象一样,标准库将负责管理与存储元素相关的内存。
头文件
使用vector须包含头文件:
#include< vector>
声明与初始化
- vector 可以声明各种类型:
整型数组:
vector vec = { 1,2,3,4,5 };
字符型:
vector vec1 = { 'h','e','l','l','o' };
double:
vector vec2 = { 1.1,2.2,3.3 };
等等很多类型。
- 利用构造函数初始化
vector():创建一个空vector
vector(int nSize):创建一个vector,元素个数为nSize
vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
vector(const vector&):复制构造函数(括号里面的也是vector)
vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
cpp
vector<int> vec{};
//vector<int> vec;
vector<int> vec1(9); //未定义初始值时默认0
vector<int> vec2(8, 1); //申请8个空间且都存1
vector<int> vec3(vec2);
//将vec1下标范围为[begin(), begin() + 1)位置上的内容复制给vec4(区间为左闭右开)
vector<int> vec4(vec1.begin(), vec1.begin() + 1);
遍历函数
reference at(int pos):返回pos位置元素的引用
reference front():返回首元素的引用
reference back():返回尾元素的引用
iterator begin():返回向量头指针,指向第一个元
iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
reverse_iterator rbegin():反向迭代器,指向最后一个元素
reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
cpp
void test() {
vector<int> vec1 = {0,1,2,3,4,5,6,7,8};
cout << vec1.at(5) << endl; //打印下标为5的内容:5
cout << vec1.front() << endl; //打印第一个的内容:0
cout << vec1.back() << endl; //打印最后一个的内容:8
//begin()不是下标,而是迭代器,它更像一个智能指针,指向容器中的元素
//此时的vec1.end()指向最后一个元素的下个位置
// i != vec1.end()这个条件保证迭代器从头元素遍历到末元素就结束
for (auto i = vec1.begin(); i != vec1.end(); i++) {
cout << *i << " "; //需要解引用 * 来获取值
}
//输出:0 1 2 3 4 5 6 7 8
cout << endl;
for (auto i = vec1.rbegin(); i != vec1.rend(); i++) {
cout << *i << " ";
}
//输出:8 7 6 5 4 3 2 1 0
}
增加函数
void push_back(const T& x)
//向量尾部增加一个元素X
iterator insert(iteratorit,const T& x)
//向量中迭代器指向元素前增加一个元素x
iterator insert(iterator it,int n,const T& x)
//向量中迭代器指向元素前增加n个相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last)
//向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
cpp
void testQ() {
vector<int> v = {6,7,8};
vector<int> v1 = { 20,30,40 };
v.push_back(10); //在尾部加1个10(单写数值不写数量均按1处理)
//此时内容为:6 7 8 10
v.insert(v.begin(), 11); //在开头位置的前面加一个11
//此时内容为:11 6 7 8 10
v.insert(v.begin()+4, 1, 9); //在下标4位置前面加1个9
//此时内容为:11 6 7 8 9 10
v.insert(v.begin() + 1, 3, 5); //在下标1位置前面加3个5
//此时内容为:11 5 5 5 6 7 8 9 10
v.insert(v.begin(), v1.begin(), v1.end()); //在v下标0位置前面加v1下标[begin,end]的内容
//此时内容为:20 30 40 11 5 5 5 6 7 8 9 10
}
删除函数
iterator erase(iterator it):删除向量中迭代器指向元素
iterator erase(iterator first,iterator last):删除向量中**[first,last)**中元素
void pop_back():删除向量中最后一个元素
void clear():清空向量中所有元素
cpp
void testQ() {
vector<int> v = {4,5,9,6,7,8};
v.erase(v.begin() + 2); //删除坐标2位置上的元素(9)
//此时内容为:4 5 6 7 8
v.erase(v.begin() + 1, v.begin() + 3);//删除坐标[1,3)位置上的元素(5、6)
//此时内容为:4 7 8
v.pop_back(); //删除最后一个元素(8)
//此时内容为:4 7
v.clear(); //清空所有元素
}
判断函数
清空所有元素之后再判断v是否为空,为空则为真,输出1
大小函数
int size() const:返回向量中元素的个数
int capacity() const:返回当前向量所能容纳的最大元素值
int max_size() const:返回最大可允许的 vector 元素数量值
cpp
void testQ() {
vector<int> v = {4,5,9,6,7,8};
cout << v.size() << endl;
cout << v.capacity() << endl;
cout << v.max_size() << endl;
}
其他函数
void swap(vector&):交换两个同类型向量的数据
cpp
void testQ() {
vector<int> v;
v.assign(5, 3); //v只含5个元素且都为3
vector<int> v1 = { 1,2,3,4,5 };
vector<int> v2 = { 11,22,33 };
v1.swap(v2); //交换v1和v2
//此时v2={1,2,3,4,5};
}
void assign(int n,const T& x):设置向量中前n个元素的值为x
void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素
cpp
void testQ() {
vector<int> v;
v.assign(5, 3); //v只含5个元素且都为3
vector<int> v1 = { 1,2,3,4,5 };
vector<int> v2 = { 11,22,33 };
for (auto i = v2.begin(); i != v2.end(); i++) {
cout << *i << " ";
}
cout << endl;
v2.assign(v1.begin(), v1.end()); //将v2设置成v1[begin,end)的内容
//v2={1,2,3,4,5}
}
练习
输入n,随机n个1-100的数字,装入vector,找出里面最大值和最小值。
cpp
void testQ() {
int n = 0;
cin >> n;
vector<int> v;
srand(time(0)); //要加ctime头文件
for (int i = 0; i < n; i++) {
v.push_back(rand() % 100 + 1); //产生1~100的随机数
}
int max = v[0], min = v[0];
for (int i = 0; i < n; i++) {
if (max < v[i]) {
max = v[i];
}
if (min > v[i]) {
min = v[i];
}
}
//查看随机数
for (int i = 0; i < n; i++) {
cout << v[i] << " ";
}
cout << endl;
cout << max << " " << min;
}