小白笔记
目录
前言
vector数据结构和数组非常相似,也被成为单端数组
vector和普通数组之间的差别是普通数组是静态空间,vector可以动态扩展(系统会自动回收,不需要最后的时候还清空)
vector容器的迭代器是支持随机访问的迭代器
一、vector的常用函数
vector v常用函数
v.front();//代表的是容器中的第一个元素
v.back();//代表的是容器中的最后一个元素
v.begin();//指向第一个元素的地址
v.end();//指向最后一个元素的下一位的地址
v.push_back(ele);//在vector尾部插入一个元素ele
v.pop_back();//删除vector尾部的一个元素
二、vector构造函数
函数原型:
vector<T> v;//默认的构造函数
vector(const vector &vec);//拷贝构造函数
vector(v.begin(),v.end());//把v[begin(),v.end())区间左闭右开中的元素拷贝给本身
vector(n,elem);//构造函数将n个elem拷贝给本身,先给个数的参数
三.vector赋值
vector& operator =(const vector &vec);//用等号直接赋值
//例子
vector<int> v1 , v2 ; v1 ={0,1,2};v2 = v1;
//v1和v2的元素数值,个数,容量,都会相等
assign(v.begin(),v.end());//把v[begin(),v.end())区间左闭右开中的元素赋值给本身
//例子
vector<int> v1 , v2 ; v1 ={0,1,2};v2.assign(v1.begin(),v1.end());
//这样v1和v2的元素数值,个数,容量,也都会相等
assign(n,elem);//将n个elem赋值给本身,先给个数的参数
//例子
vector<int> v1 ; v1.assign(10,1);
//这样的v1是{1,1,1,1,1,1,1,1,1,1}
四.vector容量和大小
函数原型:
empty();//判断容器是否为空,如果为空,返回true,不为空,返回faulse
vector<int> v = { 10 } ;cout<<v.empty();v.clear();cout<<v.empty();
//最开始的时候容器不为空,所以返回faulse。但是后面clear清空了容器,所以容器为空,所以返回的是true
capacity();//容器的容量,简单来说就是编译器自动给你动态扩展的总长度
size();//返回容器中的元素个数
vector<int> v = { 0,1,2,3,4,5,6,7,8,9 };cout<<v.size();
//因为个数偶遇10个,所以输出为10
resize(int num , int elem = 0 );
/*重新指定容器的长度为num,如果容器变长,则以elem的值填充新位置。如果容器变短,则末尾超出容器的元素被删除*/
五.vector插入和删除
push_back(ele);//在vector尾部插入一个元素ele
vector<int> v = { 0,1,2,3,4,5,6,7,8,9 };
v.push_back(10);
//v中有{0,1,2,3,4,5,6,7,8,9,10}
pop_back();//删除vector尾部的一个元素
vector<int> v = { 0,1,2,3,4,5,6,7,8,9 };
v.pop_back();
//v中有{0,1,2,3,4,5,6,7,8}
insert(const_iterator pos , ele);//迭代器指向位置pos与pos-1中间插入元素ele
vector<int> v = { 0,4,5,6,7,8,9 };
v.insert(v.begin(),10);
//v中有{10,0,4,5,6,7,8,9}
insert(const_iterator pos , int count , ele);//迭代器指向位置pos与pos-1中间插入count个元素ele
//同上
erase(const_iterator pos);//删除迭代器指向的元素
vector<int> v = { 0,1,2,3,4,5,6,7,8,9 };
v.erase(v.begin());//这个函数中不要填v.end(),会越界的
//v中有{1,2,3,4,5,6,7,8,9}
erase(const_iterator start, const_iterator end);//删除star到end-1之间的元素(包括star和end-1)
vector<int> v = { 0,1,2,3,4,5,6,7,8,9 };
v.erase(v.end()-2,v.end());
//v中有{0,1,2,3,4,5,6,7}
clear();//删除容器中的所有元素
六.vector数据获取
at(int idx);//返回索引idx所指的数据
operator[];//同上
front();//返回容器中第一个元素的数据
back();//返回容器中最后一个元素的数据
例如
vector<int> v ={0,1,2,3,4,5,6,7,8,9};
for(int i = 0 ; i < v.size() ; i++ ){
cout<<v.at(i)<<" ";//或者是写成cout<<v[i]<<" ";
}
cout<<endl;
用iterator来进行输出,输出的时候记得带上*,最开始赋值的时候要标注是vector的什么数据类型
例如
vector<int> v ={0,1,2,3,4,5,6,7,8,9};
for(vector<int>::iterator it = v.begin() ; it!=v.end() ; it++){
cout<<*it<<" ";
}
cout<<endl;
七.vector互换容器
用swap函数来互换,交换了大小,容量和元素
v.swap(vector);
swap函数是cpp自带的交换函数,其中带入后的数据是形参是实参的引用
swap函数实现交换必须两个参数内所有功能类型相匹配
或者比如用.swap(blabla)来进行交换
例如
#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<algorithm>
#include<cmath>
#include<deque>
#include<queue>
#include<list>
using namespace std;
void Print(const vector<int>& a) {
for (vector<int> ::const_iterator it = a.begin();it != a.end();it++) {
cout << *it << " ";
}
cout << endl;
}
int main(int argc, char** argv) {
vector<int> first, second;
first = { 0 ,1 ,2,3,4,5,6,7,8,9 };
second = { 10,20,30,40,50,60,70,80,90,100 };
cout << "交换前" << endl;
Print(first);
Print(second);
first.swap(second);
cout << "交换后" << endl;
Print(first);
Print(second);
return 0;
}
八.vector预留空间
目的为了减少vector在动态扩展容量时的扩展次数
通常有两情况使用reserve来避免不必要的重新分配。第一个可用的情况是当你确切或者大约知道有多少元素将最后出现在容器中。二种情况是保留你可能需要的最大的空间,然后,一旦你添加完全部数据,可修整掉任何多余的容量。
reserve(int len);//容器预留len个元素长度,分配内存,没数据,不可以被访问
九.vector与deque差别
vector对于头部的插入删除效率底,数据量越大,效率越低
deque相对而言,对于头部的插入和删除速度要比vector快
vector访问元素时的速度会要比deque快,这和两者内部实现有关