#C++STL #vector #学习笔记

vector是非常类似array的容器,其更高级的一点是其容量可以根据实时需求动态调整。本文在array容器相关方法的基础上进一步探索vector容器的动态性。

vector

Dedinition

  • 类似array容器
  • 但是容量可以根据实际需求增加[reserve()方法]或者减少[shrink_to_fit()或者swap()方法]
  • 其元素也可随机插入[insert()]或者删除[erase()]

定义、初始化、随机访问

#include<iostream>
#include<vector>

using namespace std;

int main(){
	vector<char>value;
	//插入方法1————尾部插入
	value.push_back('S');
	value.push_back('T');
	value.push_back('L');
	printf("元素个数为:%d",value.size());
	//也可利用pop_back()删除末尾元素
	
	//auto遍历
	for(auto i = value.begin();i<value.end();i++)
		cout<<*i<<" ";
	//插入方法2————随机插入
	value.insert(value.begin(),'C');
	cout<<"首个元素为:"<<value.at(0)<<endl;
	 //也可以用erase()方法随机删除元素
	 //可用clear()方法删除所有元素
	
	return 0;
}

连续访问(遍历)

#include<iostream> //输入输出
#include<vector> //引入vector容器,以使用内部模板类 

using namespace std;


int main(){
	vector<int> a{1,2,3,4,5,6,7,8,9};
	
	cout<<"第一种方法——下标访问"<<endl;
	for(int i = 0;i<a.size();i++) 
		cout<< a[i] <<" ";


	vector<int>::iterator i;	//可以用auto作为迭代器i的类型
	cout<<endl<<"第二种方法——随机迭代器顺序访问(采用<v.end())"<<endl;
	for(i = a.begin();i < a.end();i++)
		cout<< *i <<" ";
	
	cout<<endl<<"第三种方法——随机迭代器顺序访问(采用!=v.end())"<<endl;
	for(i = a.begin();i != a.end();i++)
		cout<< *i <<" ";
	
	cout<<endl<<"第四种方法——随机迭代器顺序访问(采用while循环)"<<endl;	
	i = a.begin();
	while(i<a.end()){ 
		cout<< *i <<" ";
		i+=2;
	} 
	
	//逆序迭代
	auto first1 = a.rbegin();
	auto end1 = a.rend();
	
	while(first1!=end1){
		cout<<endl<<*first1<<" "; 
		first1++;
	}
	
	
	return 0;
}

容量的动态调整

容量VS.大小

  • 容量capacity(),☞容器申请的内存空间
  • 大小size(),☞容器占用的内存空间
  • 如果myvector.capacity()==myvector.size(),再向myvector中存储元素时,myvector容器会自动扩容。
#include<iostream>
#include<vector>

using namespace std;

int main(){
	//vector自动增加容量;。
	vector<int> values;
	cout<<"大小:"<<values.size()<<" "<<"容量:" <<values.capacity()<<endl;//0 0
	
	for(int i=0;i<10;i++) values.push_back(i);
	cout<<"大小:"<<values.size()<<" "<<"容量:" <<values.capacity()<<endl;//10 16
	//指数式增加容量;
	 
	values.shrink_to_fit();//shrink_to_fit()容量缩小到和大小相等。 
	cout<<"大小:"<<values.size()<<" "<<"容量:" <<values.capacity()<<endl;// 10 10
	
	values.clear();
	cout<<"大小:"<<values.size()<<" "<<"容量:" <<values.capacity()<<endl;// 0 10
	
		
	//swap()方法同样具有shrink_to_fit()的功能
	vector<int>(values).swap(values); 
	cout<<"大小:"<<values.size()<<" "<<"容量:" <<values.capacity()<<endl;// 0 0
		
	values.shrink_to_fit();
	cout<<"大小:"<<values.size()<<" "<<"容量:" <<values.capacity()<<endl;// 0 0
	
	
	return 0;
}

利用reserve()方法申请(增加)容量

  • vector容器扩容的三个步骤
  1. 重新选择一处内存地址, 开辟一块内存空间
  2. 将原来myvector容器中的元素复制到新的地址空间中
  3. 析构掉原来myvector容器中的元素,并回收myvector容器的地址空间

因此,扩容后的容器将丢失容器迭代器等工具,需重新定义。
另一方面,扩容是一个非常耗时的过程,因此要尽量避免扩容,一次性申请足够的空间。

Reference

  1. C语言中文网相关教程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值