std::vector使用总结

本文详细介绍了std::vector在C++ STL中的使用,包括其大小和容量的概念、reserve和shrink_to_fit函数、构造函数和析构函数、各种操作如插入、移除、迭代器使用以及异常处理策略。内容涵盖了vector的动态扩容机制、元素访问、迭代器应用以及常用操作的异常处理。
摘要由CSDN通过智能技术生成

Vector

  Vector描述的是一个动态数组(dynamic array),并提供了相关操作和接口。
在这里插入图片描述
  在使用Vector之前,需要引入头文件#include<vector>,在此头文件中,类型vector是一个定义于namespace std内的template

template<
    class T,
    class Allocator = std::allocator<T>
> class vector;

  其中T可以是任意类型,Allocator用来定义内存模型,默认是C++标准库提供的allocator

Vector的能力

  Vector将元素复制到dynamic array内部,是一种动态的顺序表结构。Vector支持随机访问,可以以常量时间访问元素,Vector支持随机访问迭代器,以及STL提供的任何算法(排序、查找等)。但对于插入、删除和移动等操作,Vector效率较低(类似于数组的特性)。

大小(size)和容量(capacity)

  vector区别于一般数组的特性之一就是能够动态的“扩容”,在容量能够容纳所有元素的前提下,提供基于pointer、reference、iterator的访问,以及元素的操作等,因此,大小和容量的概念至关重要。
  Vector的大小(size)是指当前元素所占用空间,而容量(capacity)则是指vector分配内存预留大小,当size超过capacity时,vector会自动进行扩容,重新分配内存。举个例子——

vector<int> v;
	for (int i=0; i < 20; i++) {
   
		v.push_back(i);
		cout<<"i = "<<i
			<< " size = " << v.size()
			<< " capacity = " << v.capacity() << endl;
	}

在这里插入图片描述

  可以看出,vector的大小是随着插入元素不断增加的,也就是说,size()的作用其实和sizeof的作用类似,但是由于vector都是reference语义的操作,sizeof一个vector对象,无法得到实际大小,所以vector提供了size成员函数。而capacity()则反映了vector的动态扩容机制。
  vector容量的概念之所以重要,有两个原因——
  1.一旦内存重新分配,vector相关元素的所有reference、pointer、iterator都会失效。这里的失效是指,原来的值需要更新到重新分配后的内存地址。
  2.内存的重新分配需要一定时间。

reserve函数

  通过reserve函数可以显式的指定预留空间的大小,而避免vector反复的进行内存重新分配, 从而提高vector的使用效率。但reserve不能减小vector容量,比如,已存在vector.capacity = 100,使用reserve(80)不会有任何作用。

	vector<int> v(100);
	cout<<v.size()<<" "<<v.capacity()<<endl;
	v.reserve(80);
	cout<<v.size()<<" "<<v.capacity()<<endl;

在这里插入图片描述

  此外,还可以通过vector的构造函数显式的指定容量大小,比如:

	vector<int> 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值