文章目录
1. vector基本概念
- vector数据结构和数组非常相似,也称为单端数组
- 不同之处在于数组是静态空间,而vector可以动态扩展
- 这里的动态拓展并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间(因此应该提前估计数据大小,避免频繁地拷贝和释放原空间)
- vector容器的迭代器是支持随机访问的迭代器(数组当然可以随机访问)
2. vector构造函数
-
vector<T> v;
: 采用模板实现类实现,默认构造函数vector<int> v;
-
vector<T> v(int cap);
: 指定容器容量, 创建10个默认值为0的容器vector<int> v(10);
-
vector(v.begin(), v.end());
: 将另外一个vector v[begin(), end())区间中的元素拷贝给本身vector<int> v1; v1.push_back(1); v1.push_back(2); vector<int> v2(v1.begin(),v1.end());
-
vector(n, elem);
: 构造函数将n个elem拷贝给本身vector<int> v(3,6);//6 6 6
-
vector(const vector &vec);
: 拷贝构造函数vector<int> v1(3,6); vector<int> v2(v1);
3. vector赋值操作
-
vector& operator=(const vector &vec);
: 重载等号操作符, 可以将另外一个vector赋值给自身vector<int> v1(3,6); vector<int> v2=v1;
-
assign(beg, end);
: 将[beg, end)区间中的数据拷贝赋值给本身vector<int> v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); vector<int> v2; v2.assign(v1.begin(),v1.end());
-
assign(n, elem);
: 将n个elem拷贝赋值给本身vector<int> v1; v1.assign(5,6);
4. vector容量和大小
-
empty();
: 判断容器是否为空vector<int> v; vector<int> v; cout<<v.empty()<<endl;//1 v.push_back(1); cout<<v.empty()<<endl;//0
-
capacity();
: 容器的容量vector<int> v(10);//指定容量大小为10 cout<<v.capacity()<<endl;//10
-
size();
: 返回容器中元素的个数vector<int> v={ 1,2,3}; cout<<v.size()<<endl;//3
-
resize(int num);
:重新指定容器的长度为num,若容器变长,则以默认值(int类型为0)填充新位置。如果容器变短,则末尾超出容器长度的元素被删除vector<int> v={ 1,2,3}; v.resize(2);//1 2 v.resize(5);//1 2 0 0 0
-
resize(int num, elem);
: 重新指定容器的长度为num,若容器变长,则以指定elem值填充新位置如果容器变短,则末尾超出容器长度的元素被删除vector<int> v={ 1,2,3}; v.resize(2,99);//1 2 v.resize(5,99);//1 2 99 99 99
容器的capacity不等于size, size<=capacity, capacity是开辟的可以最多存放的元素个数,size是容器实际存放的元素个数
5. vector插入和删除
-
push_back(ele);
: 尾部插入元素elevector<int> v; v.push_back(1); v.push_back(2);//1 2
-
pop_back();
: 删除最后一个元素vector<int> v; v.push_back(1); v.push_back(2);//1 2 v.pop_back();//1
-
insert(const_iterator pos, ele);
: 迭代器指向位置pos插入元素elevector<int> v={ 1,2,3,4,5,6}; int pos=0; for(vector<int>::iterator it=v.begin();it!=v.end();it++) { if(pos==1){ //向下标1的位置插入元素22 v.insert(it,22); } pos++; } print_vector(v);//1 22 2 3 4 5 6
-
insert(const_iterator pos, int count,ele);
: 迭代器指向位置pos插入count个元素elevector<int> v={ 1,2,3,4,5,6}; int pos=0; for(vector<int>::iterator it=v.begin();it!=v.end();it++) { if(pos==1){ v.insert(it,2,22);//向下标1的位置插入2个元素22 } pos++; } print_vector(v);//1 22 22 2 3 4 5 6
-
erase(const_iterator pos);
: 删除迭代器指向的元素vector<int> v={ 1,2,3,4,5,6}; int pos=0; for(vector<int>::iterator it=v.begin();it!=v.end();it++) { if(pos==1){ v.erase(it);//删除下标为1的元素2 } pos++; } print_vector(v);//1 3 4 5 6
-
erase(const_iterator start, const_iterator end);
: 删除迭代器从start到end之间的元素vector<int> v={ 0,1,2,3,4,5}; vector<int>::iterator start_iter; vector<int>::iterator end_iter; int pos=0; for(vector<int>::iterator it=v.begin();it!=v.end();it++) { if(pos==1){ start_iter=it;//开始区间位置为下标1 } if(pos==3){ end_iter=it;//结束区间位置为下标3 } pos++; } v.erase(start_iter,end_iter);//左闭右开 删除区间[1,3)中的元素 print_vector(v);//0 3 4 5
-
clear();
: 删除容器中所有元素vector<int> v={ 0,1,2,3,4,5}; v.clear();
6. vector数据存取
-
at(int idx);
: 返回索引idx所指的数据vector<int> v={ 0,1,2,3,4,5}; cout<<v.at(2)<<endl;//2
-
operator[];
: 返回索引idx所指的数据, 重写了[]运算符vector<int> v={ 0,1,2,3,4,5}; cout<<v[2]<<endl;//2
-
front();
: 返回容器中第一个数据元素vector<int> v={ 0,1,2,3,4,5}; cout<<v.front()<<endl;//0
-
back();
: 返回容器中最后一个数据元素vector<int> v={ 0,1,2,3,4,5}; cout<<v.back()<<endl;//5
7. vector互换容器
swap(vec);
: 将另外一个vector容器与本身的元素互换
vector<int> v1= {
0,1,2,3,4,5};
vector<int> v2= {
2,1,0};
cout<<v1.capacity()<<endl;//6
cout<<v2.capacity()<<endl;//3
v1.swap(v2);
print_vector(v1);//2 1 0
print_vector(v2);//0 1 2
cout<<v1.capacity()<<endl;//3
cout<<v2.capacity()<<endl;//6
- 交换元素的同时,容器的capacity也发生了改变
8. vector预留空间
- 减少vector在动态扩展容量时的扩展次数
reserve(int len);
: 容器预留len个元素长度,预留位置不初始化,元素不可访问。
vector<int> v;
cout<<"size: "<<v.size()<<" capacity: "<<v.capacity()<<endl;//0 0
v.reserve(3);
cout<<"size: "<<v.size()<<" capacity: "<<v.capacity()<<endl;//0 3