栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[17] C++STL容器篇之向量vector

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[17] C++STL容器篇之向量vector

C++STL容器篇之向量vector

文章目录
  • C++STL容器篇之向量vector
    • 什么是向量
    • 向量vector和数组array的区别
    • 向量vector和链表的区别
    • 向量的基本用法
      • 需要包含的头文件
      • vector的创建方式
      • vector的访问方式
      • vector的遍历方式
    • 向量的一些基本成员函数
    • 简单地使用一下vector

什么是向量

在C++中向量是一个可以存放数据的容器,并且这个容器可以自动扩展(这一点和定长数组就有区别)。

向量vector和数组array的区别

从肉眼就能直接看到的区别就是,数组array是定长的,在创建的时候就确定了内存大小,不能再改变。向量vector是动态的,在创建的时候可以确定大小,也可以不确定大小;创建之后,vector可以通过成员函数扩充内存大小。

向量vector和链表的区别

链表也是可以扩充内存大小的,两者的区别就是,向量可以通过下标法访问数据,链表不可以。链表想访问数据必须是从头开始一个个访问。

向量的基本用法 需要包含的头文件

vector头文件

#include 
vector的创建方式

关于vector的创建方式有很多中,这是因为它这个类的构造函数重载得多。因为是模板,所以尖括号是不能漏的,尖括号里存的是具体的数据类型,这里用int类型为例 。

vector vect;			//没有确定长度
vector vect2(3);		//确定长度是3,3个数据都是0
vector vect3(2, 1);	//确定长度是2,并且用1填充内存,2个数据都是1
vector vect4(vect);	//拷贝初始化
vector vect5 = vect;	//拷贝初始化
vector vect6 = { 1,2,3 };		//列表初始化
int arr[3] = { 1,3,5 };
vector vect7(arr, arr + 2);	//数组区域初始化
vector vect8(vect6.begin(), vect6.end());	//向量区域初始化
vector的访问方式

一共有两种访问方式:

  • 下标法直接访问
  • at成员函数法访问
vector vect={5,1,1,3};
vect[2]=99;
vect.at(3)=1001;

注意点:vector的访问必须在vector对象被分配内存的条件下才能访问。就比如上面的vect是vector的对象,已经初始化{5,1,1,3}的内存给它,这个时候可以使用下标法和成员函数法访问到里面的元素。

但如果是下面代码就不能访问到元素:

vector vect;
vect[0]=88;
vect.at(0)=99;

这个代码就是错的。因为vect根本就没有分配到内存,所以也就没有访问内存的说法。

注意点:vector虽然是动态的,但是访问也是不能越界的。只有真的有内存了才能访问到里面的元素,不然会越界。这一点和数组是一样的性质。vector经过扩充后,就可以访问得到。

这一点很好理解,现在有5个房间,每个房间里有一个美女,你要进房间去和美女约会,你只能在这5个中选择,你不能访问第六个房间的美女,你要是想,那就只能从原来的5个房间扩充到6个房间,然后你才能访问到第六个房间。

vector的遍历方式

一、类似数组版方式遍历

vector vect = { 5,4,38,1,5 };
for (int i = 0; i < vect.size(); i++)
{
	cout << vect[i] << 't';
}
cout << endl;

二、新版for循环版遍历

vector vect = { 5,4,38,1,5 };
for (auto v : vect)
{
	cout << v << 't';
}
cout << endl;

三、内置迭代器方式遍历

vector vect = { 5,4,38,1,5 };	
vector::iterator iter;
for (iter = vect.begin(); iter != vect.end(); iter++)
{
	cout << *iter << 't';
}
cout << endl;
向量的一些基本成员函数
成员函数名功能参数
at访问向量的元素向量元素的下标,从零开始计数
size返回向量当前容器元素的个数
capacity返回容器的大小
empty判断容器是否为空,为空返回1,不为空返回0
push_back往容器的尾部加一个元素对应类型的元素
assign用另一个容器赋值给当前容器指定区域(指针表示)例如:arr,arr+3
begin返回容器首元素的地址,返回的是迭代器不是指针
end返回容器最后一个元素的下一个地址,返回的是迭代器不是指针
front返回容器首元素的引用,相当于容器的第一个元素
back返回容器最后一个元素的引用,相当于最后一个元素
data返回容器首元素的地址,返回的是指针不是迭代器
insert指定位置插入n个m元素容器的位置,个数,要插入的元素
clear清空容器,使容器为空,没有返回值
erase一个参数:是指定删除该位置的元素位置
erase两个参数:是指定从第一个参数的位置删除元素一直到第二个位置结束位置1,位置2

还有很多成员函数,建议直接去编译器上面玩,成员函数中还有重载函数。太多了。

简单地使用一下vector

直接看代码:

#include 
#include 
using namespace std;
int main()
{
	vector vect(5, 6);
	cout <<"vect.empty()="<::iterator iter;
	iter=vect.insert(vect.begin(), 99);
	cout << "*iter=" << *iter << endl;
	cout << "vect的元素:" << endl;
	for (int i = 0; i < vect.size(); i++)
	{
		cout << vect.at(i) << 't';
	}
	cout << endl;
	iter = vect.insert(vect.begin() + 2, 1001);
	cout << "*iter=" << *iter << endl;
	cout << "vect的元素:" << endl;
	for (int i = 0; i < vect.size(); i++)
	{
		cout << vect.at(i) << 't';
	}
	cout << endl;
	vect.pop_back();
	cout << "删除最后一个元素之后:" << endl;
	for (iter = vect.begin(); iter != vect.end(); iter++)
	{
		cout << *iter << ' ';
	}
	cout << endl;
	return 0;
}

输出结果:

vect.empty()=0  vect.size()=5
vect(5,6):
6 6 6 6 6
6 6 6 6 6 0 1 2 3 4
vect.size()=6
vect.clear()之后:
vect.size()=0
vect重新插入数据:
1 2 3 4 5
*iter=99
vect的元素:
99      1       2       3       4       5
*iter=1001
vect的元素:
99      1       1001    2       3       4       5
删除最后一个元素之后:
99 1 1001 2 3 4

Cukor主页

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/296355.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号