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

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晴空๓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值