vector容器--一个动态数组,可以存储任意类型的元素,并有一系列方便的操作函数
与普通数组区别:数组是静态空间,而vector可以动态拓展
特点
-
动态大小:根据需要自动调整大小
-
动态拓展:并不是在原空间上接新空间,而是找一个更大的内存空间,然后将原数据拷贝到新空间,然后释放原空间
-
-
连续存储:元素在内存中是连续存储的,这使得对元素访问非常高效
-
随机访问:类似数组一样可以通过索引进行随机访问
-
尾部插入和删除:提供了快速的尾部插入和删除操作
构造函数
功能描述:创建vector容器
函数原型:
-
vector<T> v
; //采用模板实现类实现,默认构造函数 -
vector(v.begin(),v.end())
; //将v[begin(), end())区间中的元素拷贝给本身。 -
vector(n,elem);
//构造函数将n个elem拷贝给本身。 -
vector(const vector &vec)
//拷贝构造函数。
赋值操作
给vector容器进行赋值
函数原型:
vector& operator=(const vector &vec);
//重载等号操作符
assign(beg,end)
//将[beg,end)区间数据拷贝赋值给本身
assign(n,elem)
//将n个elem拷贝赋值给本身
vector容量和大小
对vector容器的容量和大小进行操作
-
empty();
//判断容器是否为空 -
capacity();
//容器的容量 -
size();
//返回容器中元素的个数 -
resize(int num);
//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。//如果容器变短,则末尾超出容器长度的元素被删除。
-
resize(int num, elem);
//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。//如果容器变短,则末尾超出容器长度的元素被删除
对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();
//删除容器中所有元素
数据存取
-
at(int idx);
//返回索引idx所指的数据 -
front()
//返回容器第一个数据元素 -
back()
//返回容器最后一个数据元素
互换容器
实现两个容器内元素进行呼唤
-
swap(vec);
//将vec与本身的元素互换
预留空间
减少vector在动态拓展容量时的拓展次数
-
reserve(int len);
//容器预留len个元素长度,预留位置不初始化,元素不可访问
(频繁push_back和pop_back的解决办法)
还有的解决办法是
-
使用emplace_back函数,C++11新特性,允许在std::vector末尾直接构造元素,而无需显式创建临时对象或者移动操作,这样可以避免额外的复制和移动开销,提高性能。
-
使用std::deque容器,双端队列也是新特性,支持在容器两端高效插入和删除,不需要进行内存重新分配和元素赋值,因此在push_back和pop_back时有更好的性能。
遍历方式
for_each接收参数:
template <class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f);
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
std::vector<int> v = {1,2,3,4,5};
//迭代器
std::vector<int>::iterator pBegin = v.begin();
std::vector<int>::iterator pEnd = v.end();
//第一种遍历方式,通过下标
void print1(){
for(int i = 0;i<v.size();i++){
std::cout << v[i] << std::endl;
}
}
//第二种遍历方式,通过迭代器
void print2(){
for(std::vector<int>::iterator it = pBegin;it!=pEnd;it++){
std::cout << *it << std::endl;
}
}
void MyPrint(int val) {
std::cout << val << std::endl;
}
//第三种遍历方式
void print3(){
for_each(pBegin,pEnd,MyPrint);
}
int main(){
print1();
print2();
print3();
return 0;
}