c++标准模板库(STL) vector容器整理
1. vector
vector翻译为向量,理解为“变长数组”,长度根据需要而自动改变的数组。vector在内存中分配一块连续的内存空间进行存储,支持不指定vector大小的存储。
优点:
- 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组进行动态操作。通常体现在push_back() pop_back()。
- 随机访问方便,即支持[ ]操作符和vector.at()
- 节省空间。
缺点:
- 在内部进行插入删除操作效率低。
- 只能在vector的最后进行push和pop,不能在vector的头进行push和pop。
- 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放
1.1 vector定义
初始化定义一个数组:
vector<int> vec;
vector<int> vec(m, 0);//定义大小为m的数组,初始化为0
vector<vector<int>> vec_2D(n, vector<int>(m, 0));//定义大小为n行m列的数组,初始化为0
//通过数组初始化
double a[]= {1.0, 2.0, 3.0, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0};
vector<double> arr(a,a+10);
1.2 vector元素访问
vector两种访问方式,下标访问和迭代器访问。其中注意迭代器的begin()是取首元素,但是end()是取尾元素的下一个地址,而不存储任何元素。美国人的思维是左闭右开。
下面是三种方式的遍历模板:
//通过下标访问
for(int i = 0;i<vec.size();i++){
cout<<vec[i];
}
//通过迭代器访问,其中vec[i]==*(vec.begin+i);但是只有vector和string允许迭代器加整数的写法。
vector<int>::iterator it = vec.begin();
for(int i = 0;i<vec.size();i++){
cout<<*(it+i);
}
//通过迭代器访问
for(vector<int>::iterator it = vec.begin();it!=vec.end();it++){
cout<<*it;
}
1.3 vector常用函数
vector的基本功能如下:
vec.push_back({1, 2, 3});//添加元素
vec.pop_back();//删除尾元素
cout<<vec.size();//返回数组大小
vec.clear();//清空数组
cout<<vec.empty();//判断是否为空
初此之外,还有一些常用的函数:
find()函数,查找vector指定的元素
vector<int>::iterator it = find( vec.begin(), vec.end(), 3 ); //查找3
if ( it == vec.end( ) ) //没找到
cout << "No" << endl;
else{//找到
cout << "Yes" << endl;
cout << distance(vec.begin(), it)<<endl;//如果找到的话,那么这个it的位置表示第一次出现3的位置
}
insert()函数,insert(it, x)用来向任意迭代器it的处插入一个元素x
vec.insert(vec.begin()+2, -1);//将-1插入vec[2]的位置
erase()函数, 删除元素,有两种情况
vec.erase(vec.begin()+1);//删除vec[3]
vec.erase(vec.begin()+1, vec.begin()+4);//删除一个区间的元素
还有一些在#include <algorithm>
头文件下的常用操作
求vector最大最小值使用max_element()和min_element()
vector<double>::iterator max = max_element(arr.begin(),arr.end());
vector<double>::iterator min = min_element(arr.begin(),arr.end());
reverse(),将容器翻转
reverse(vec.begin(),vec.end());
sort(),排序函数
sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).
//可以通过重写排序比较函数按照降序比较,如下:
//定义排序比较函数:
bool Comp(const int &a,const int &b)
{
return a>b;
}
sort(vec.begin(),vec.end(),Comp)//这样就降序排序。
fill() 可以把容器某一区间赋为相同的某个值
fill(vec.begin(), vec.begin()+10, 233);
lower_bound()和upper_bound() 在[first,last)范围内
lower_bound(first, last, val)用来寻找范围内第一个值大于等于val元素的位置,返回迭代器。
unpper_bound(firse, last, val)用来寻找范围内第一个值大于val元素的位置,返回迭代器。
等等……