vector容器数据结构与数组十分类似,也称为单端数组。vector与数组的不同之处在与数组是静态空间,而vector可以动态扩展。
这里简单介绍一下什么是动态扩展:
动态扩展并不是在原空间之后续接新的空间(因为无法保证后序的空间是否被占用),而是找一个更大的内存空间,然后将原数据拷贝到新空间,并释放原来的空间。
具体vector容器的结构图如下所示:
从图中可以看出:
1.push_back()方法用于在尾部插入数据,pop_back()用于在尾部删除数据,即尾插与尾删;
2.front()代表容器中的第一个元素,back()代表容器中的最后一个元素;
3.vector主要有4个迭代器,v.begin()代表第一个元素的位置,v.end()代表最后一个元素的下一个位置,v.rbegin()代表尾部第一个元素的位置,而v.rend()代表第一个元素的前一个位置;
4.vector对外提供了很多接口,包括insert可以插入数据,erase可以删除数据等。
另外需要注意的是:vector容器的迭代器是支持随机访问的迭代器。
1.vector的构造函数
函数 | 描述 |
---|---|
vector<T> v | 采用模板实现类实现,默认构造函数 |
vector(v.begin(),v.end()) | 将v[begin(),end())区间中的元素拷贝给本身,即区间构造 |
vector(n,elem) | 构造函数将n个elem元素拷贝给本身 |
vector(const vector& vec) | 拷贝构造函数 |
具体的实现检验代码如下所示:
#include<iostream>
#include<vector>
using namespace std;
//vector容器的构造函数
void printVector(vector<int>&v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}//输入vector容器中的元素
int main() {
vector<int> v1;//默认构造 无参构造
for (int i = 0; i < 10; i++) {
v1.push_back(i);;
}
printVector(v1);
//通过区间方式进行构造
//v1.begin()代表第一个元素的位置 v1.end()代表最后一个元素的下一个位置
vector<int> v2(v1.begin()+1, v1.end()-1);
printVector(v2);
//n个elem方式构造
vector<int> v3(10, 100);//10个100的初始化操作
printVector(v3);
//拷贝构造
vector<int> v4(v3);
printVector(v4);
return 0;
}
总之,vect的多种构造方式没有可比性,灵活使用即可!
2.vector的赋值操作
vector的赋值操作主要有operator=和assign两种赋值方式,具体使用如下表所示:
函数 | 描述 |
---|---|
vector& operator=(const vector & vec) | 重载等号操作符 |
assign(beg,end) | 将[beg,end)区间中的数据拷贝赋值给本身 beg和end都是迭代器 |
assign(n,elem) | 将n个elem拷贝赋值给本身 |
#include<iostream>
#include<vector>
using namespace std;
//vector容器的赋值操作
void printVector(vector<int>&v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
int main() {
vector<int> v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
printVector(v1);
//赋值 operator=
vector<int> v2;
v2 = v1;
printVector(v2);//作用和拷贝构造函数类似 即vector<int> v2(v1)
//assign赋值
vector<int> v3;
v3.assign(v1.begin(), v1.end());
printVector(v3);
//n个elem方式赋值
vector<int> v4;
v4.assign(10, 100);
printVector(v4);
return 0;
}
总结:vector赋值方式简单,使用operator=或者assign都可以,总是一定要熟练使用一种。
3.vector容量和大小
对vector容器的容量和大小的操作主要有empty,capacity,size,resize等函数可以使用,具体如下表所示:
函数 | 描述 |
---|---|
empty() | 判断容器是否为空 |
capacity() | 返回容器的容量 |
size() | 返回容器中元素的个数 |
resize(int num) | 重新制定容器的长度为num,若容器变长,则以默认值0填充新位置,如果容器变短,则末尾超出容器长度的元素被删除 |
resize(int num,int elem) | 重新制定容器的长度为num,若容器变长,则以elem填充新位置,如果容器变短,则末尾超出容器长度的元素被删除 |
#include<iostream>
#include<vector>
using namespace std;
//vector容器的赋值操作
void printVector(vector<int> &v) {
for (auto it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
int main() {
vector<int> v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
printVector(v1);
//判断容器是否为空
if (v1.empty()) {//为真代表容器为空
cout << "v1容器为空" << endl;
}else{
cout << "v1容器不为空" << endl;
cout << "v1的容量为:" << v1.capacity() << endl;
cout << "v1中元素的个数为:" << v1.size() << endl;
}
//重新制定大小
v1.resize(15);//如果重新指定的大小比原来更长 默认用0填充新的位置
printVector(v1);
v1.resize(20, 100);//利用重载的版本resize可以指定默认填充值
printVector(v1);
v1.resize(5);//如果重新指定的大小比原来短了 超出本分会自动删除
printVector(v1);
return 0;
}
4.vector容器的插入与删除
函数 | 描述 |
---|---|
push_back(ele) | 尾部插入元素ele |
pop_back() | 删除最后一个元素 |
insert(const_iterator pos,ele) | 迭代器指向位置pos插入元素ele |
insert(const_iterator pos,int count ele) | 迭代器指向位置pos插入count个元素ele |
erase(const_iterator pos) | 删除迭代器指向的元素 |
erase(const_iterator start,const_iterator end) | 删除迭代器从start到end之间的元素 |
clear() | 删除容器中所有元素 |
具体API的操作代码如下所示:
#include<iostream>
#include<vector>
using namespace std;
//vector容器的插入与删除
void printVector(vector<int> &v) {
for (auto it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
int main() {
vector<int> v1;
//尾插
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
//遍历
printVector(v1);
//尾删
v1.pop_back();
printVector(v1);
//插入 第一个参数是迭代器
v1.insert(v1.begin(), 100);
printVector(v1);
v1.insert(v1.end(), 2, 1000);
printVector(v1);
//删除 参数也是迭代器
v1.erase(v1.begin());
printVector(v1);
//区间删除 仅仅保留最后一个元素
v1.erase(v1.begin(), v1.end()-1);
printVector(v1);
//清空
v1.clear();//相当于v1.erase(v1.begin(),v1.end());
return 0;
}
5.vector数据存取
对vector中的数据进行存取操作,主要有两种方式,即是通过at()函数以及[]来获取,另外通过front()可以获取容器中的第一个元素,通过back()可以获取最后一个元素。具体如下表所示:
函数 | 描述 |
---|---|
at(int index) | 返回索引index所指的元素 |
operator[index] | 返回索引index所指的数据 |
front() | 返回容器中的第一个元素 |
back() | 返回容器中的最后一个元素 |
#include<iostream>
#include<vector>
using namespace std;
//vector容器数据存取
int main() {
vector<int> v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
//利用[]来访问数组中的元素
for (int i = 0; i < v1.size(); i++) {
cout << v1[i] << " ";//string的遍历每个字符也可以使用[]
}
cout << endl;
for (int i = 0; i < 10; i++) {
cout << v1.at(i) << " ";//string的遍历每个字符也可以使用at函数
}
cout << endl;
//获取容器的第一个元素
cout << "v1容器中的第一个元素是:" << v1.front();
//获取容器中的最后一个元素
cout << "v1的最后一个元素为:" << v1.back();
return 0;
}
总之,访问vector容器中的元素有三种方式,即迭代器,[]和at函数!
6.vector互换容器
vector容器互换其本质上就是实现两个容器内元素进行互换。
函数 | 描述 |
---|---|
void swap(vector<T> &vec) | 将vec与本身的元素互换 |
#include<iostream>
#include<vector>
using namespace std;
//vector容器的互换
/*
实际用途
巧用swap可以收缩内存空间
*/
void test() {
vector<int> v;
for (int i = 0; i < 100000; i++) {
v.push_back(i);
}
cout << "v的容量为:" << v.capacity() << endl;
cout << "v的大小为:" << v.size() << endl;
//重新指定大小 但是v1容器的所占容量不变
v.resize(3);
cout << "v的容量为:" << v.capacity() << endl;
cout << "v的大小为:" << v.size() << endl;
//巧用swap收缩内存
vector<int>(v).swap(v);
cout << "v的容量为:" << v.capacity() << endl;
cout << "v的大小为:" << v.size() << endl;
}
void printVector(vector<int>& v) {
for (auto it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
int main() {
cout << "v1与v2交换前" << endl;
vector<int> v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
printVector(v1);
vector<int> v2;
for (int i = 10; i > 0; i--) {
v2.push_back(i);
}
printVector(v2);
cout << "v1与v2交换后" << endl;
v1.swap(v2);
printVector(v1);
printVector(v2);
test();
return 0;
}