C++STL之vector详解
一、STL简介
STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。STL 是 C++ 标准库的一部分,不用单独安装。
C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。例如,vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash\_set 的底层为哈希表。
STL 从根本上讲是“容器”的集合,也是组件的集合。容器包括 list、vector、set、map 等;组件包括迭代器等。STL 的目的是标准化组件。
STL 是 C++ 的一部分,不用额外安装,被内建在支持 C++ 的编译器中。
STL 的算法是标准算法,其实现了将已经定义好的算法应用在容器的对象上。
更多STL介绍请看STL是什么
二、C++ vector简介
vector<T> 容器是包含 T 类型元素的序列容器,和 array<T,N> 容器相似,不同的是 vector<T> 容器的大小可以自动增长,从而可以包含任意数量的元素;因此类型参数 T 不再需要模板参数 N。只要元素个数超出 vector 当前容量,就会自动分配更多的空间。只能在容器尾部高效地删除或添加元素。
vector<T> 容器可以方便、灵活地代替数组。在大多数时候,都可以用 vector<T> 代替数组存放元素。只要能够意识到,vector<T> 在扩展容量,以 及在序列内部删除或添加元素时会产生一些开销;但大多数情况下,代码不会明显变慢。 为了使用 vector<T> 容器模板,需要在代码中包含头文件 \#include<vector>。
时间复杂度:该容器随机存取任何元素都能在常数时间O(1)完成,在尾端增删元素具有最佳的性能(大部分时间是常数时间,即在不需要重新分配存储空间的情况下。在一些特殊的情况下需要的时间是O(n),比如当所需要的存储空间超过了之前动态分配的空间,这时候就需要重新分配存储空间,需要进行一个数组的拷贝工作)当在vector<T>中间或者头部插入或者删除元素所需要的时间复杂度为O(n)因为我们需要将后面的元素一次向后移动一个位置。
三、C++ vector的常用方法
#include<iostream>
#include<vector>
using namespace std;
//定义一个输出vector模板
/*为了方便打印不同类型的vector,如果vector的类型比较少
可以使用for循环打印,例如定义一个 vector<int> num;
输出可以用:
//输出num中的内容 size():返回Vector元素数量的大小
for(int i=0;i<num.size();i++){
cout<<num[i]<<" "; //可以使用[]访问,也可以使用at()方法访问
cout<<num.at(i)<<" "; //at():返回指定位置的元素
}
cout<<endl;
*/
template<class T>
void printVector(T s,T e){
for(;s != e;++s){
cout<<*s<<" ";
}
cout<<endl;
}
int main(){
vector<int> num; //生成存放 int 型元素的 vector<T> 容器
cout<<"赋值之前num的容量:"<<num.capacity()<<endl;
//capacity()返回vector所能容纳的元素数量(在不重新分配内存的情况下) 此时没有初始化,所以size() 和 capacity() 都是0;size() 返回容器目前存在的元素个数。
//以初始化列表中的値作为元素初始值,生成有 6个浮点数的vector容器。
double a[6] = {1.1,2.6,3.8,4.9,5.6,6.6};
vector<double> number(a,a+6);
printVector(number.begin(),number.end());
//string A[4] = {"str1","str2","str3","str4"};
//vector<string> str(A,A+4);
//str有4个元素,全部初始化为 "abc"
vector<string> str(4,"abc");
printVector(str.begin(),str.end());
//向容器中添加元素
for(int i=0;i<10;i++){
num.push_back(i); //push_back():在Vector最后添加一个元素
}
cout<<"赋值之后num的容量:"<<num.capacity()<<endl;
//输出num中的内容 size():返回Vector元素数量的大小
for(int i=0;i<num.size();i++){
cout<<num[i]<<" "; //可以使用[]访问,也可以使用at()方法访问
cout<<num.at(i)<<" "; //at():返回指定位置的元素
}
cout<<endl;
//insert():插入元素到Vector中
num.insert(num.begin()+3,10); //将 10 插入到下标为3的位置
//begin():返回第一个元素的迭代器
//end():返回最末元素的迭代器(译注:实指向最末元素的下一个位置)
printVector(num.begin(),num.end());
//将num的一段0,1,2,3,4从下标为 3 的位置插入
num.insert(num.begin()+3,num.begin(),num.begin()+5);
printVector(num.begin(),num.end());
num.erase(num.begin()+3); //删除下标为 3 位置上的元素
printVector(num.begin(),num.end());
//删除一段元素
num.erase(num.begin(),num.end()-2);
printVector(num.begin(),num.end());
cout<<"删除前str内容为:";
printVector(str.begin(),str.end());
//删除所有的元素
str.clear();
cout<<"删除后str内容为:";
printVector(str.begin(),str.end());
return 0;
}
运行结果:
四、C++ vector的所有方法(更加详细的内容请参考C++的API:https://en.cppreference.com/w/cpp/container/vector)
还没有评论,来说两句吧...