STL容器篇之array与vector(学习篇)

这篇具有很好参考价值的文章主要介绍了STL容器篇之array与vector(学习篇)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

array

简单介绍

array 是STL 中一个容器, 是一个定值数组
相当于C语言中 array[5].
在C++中, 使用容器都要使用想对应的头文件
例如:
使用array这个容器,就要使用 这个头文件

#include<vector>

创建对象以及赋值

二种方法:

第一种:array<数据类型, 大小> 对象;
赋值 : 例如:array<int , 3> = {0, 2, 4};
第二种: 用new
array<数据类型, 大小> * 变量名称 = new array<数据类型, 大小>;
赋值: (*变量名称)[数组下标] = 值
例如 : *arr3[0] = “温柔了岁月”

	//array 2种方法 创建对象
	//第一种 array<数据类型, 大小> 对象
	array<int, 3> arr1;

	//第一种直接赋初值  array<数据类型, 大小> 对象 = {0, 2}可以直接赋值
	array<int, 3> arr2 = { 0, 2 };

	//第二种:用new
	array<string, 3>* arr3 = new array<string, 3>;
  //赋值操作* arr3)[0] = "温柔了岁月";
   
   delete arr3;

通常使用第一种,第二种赋值方式相对于第一种过于麻烦

array中常用内置函数介绍

使用方法: 对象.函数

1.size(), 计算大小
2.empty(), 判断是否为空
3.begin(), 可以指向array数组的第一个元素,
注意:也可以表示array数组中的第一个元素
4.end(), 指向array数组中的最后一个元素,
注意:不表示array数组中的最后一个元素
5. front(), 第一个元素
6. back(), 最后一个元素
7. at(), 可以访问array数组中的数据**,注意需要加参数,array数组的下标**

这些内置函数, 有的后面会多次涉及最好记住

// STL中内置的函数 size() 计算大小
	cout << arr2.size() << endl;
	cout << arr3->size() << endl;

	//C++中empty ()函数的作用是用来判断容器是否为空 
	//empty ()函数返回值为true,说明容器为空 empty ()函数返回值为false,说明容器不为空

	cout << arr1.empty() << endl;

array数组的访问(正向遍历)

第一种:简单的for循环,用 cout 遍历打印不过array的大小用size计算
第二种:也是for循环,与第一种不同的是, 用array的内置函数at,来打印
第三种:则是遍历容器常用的方法
用迭代器的方法(三种)
这里讲解第一种,也是用的最多的
首先
1.array<数据类型, 大小> ::(作用域) iterator(迭代器) 对象 = arr2.begin(),指向 第一个 元素
2.array<数据类型, 大小> ::(作用域) iterator(迭代器) 对象 = arr2.end(),指向 最后一个元素
3.for循环挨个打印,直到到最后一个元素

迭代器你可以变相的理解为指针,代表着地址
所以 * arr2.begin() 代表着值

//array的访问

	//第一种 cout

	//for (int i = 0; i < arr2.size(); i++)
	//{
	//	cout << arr2[i] << endl;
	//}
	第二种 内置函数at()

	//for (int i = 0; i < arr2.size(); i++)
	//{
	//	cout << arr2.at(i) << endl;
	//}

	//运用迭代器  三种方法
	//第一种(常用)

	for (array<int, 3> ::iterator it = arr2.begin(); it != arr2.end(); it++)
	{
		cout << *it << endl;
	}
	
	 //第二种方法

	array<int, 3> ::iterator itBegin = arr2.begin();
	array<int, 3> ::iterator itEnd = arr2.end();

	while (itBegin != itEnd)
	{
		cout << *itBegin << endl;
		
		itBegin++;
	}
	//第三种 each_for()算法  ,这里暂不介绍, 后续讲算法的时候介绍

指针形式遍历

for (int i = 0; i < arr3->size(); i++)
	{
		cout << arr3->at(i) << endl;
	}

逆向遍历(反向迭代器)

正向迭代器:iterator
反向迭代器 reverse_iterator

rbegin() 指向array中最后一个元素
rend()指向array中第一个元素

	for (array<int, 3> ::reverse_iterator it = arr2.rbegin(); it != arr2.rend(); it++)
	{
		cout << *it << endl;
	}

*注意:不能用正向迭代器,反着写,逆向打印array中的元素
因为 arr2.end() 并不代表 array中最后一个元素

如果这样操作,将会出现如下错误
STL容器篇之array与vector(学习篇)

array的嵌套

array本身是一个定长的数组,
嵌套一次,便是定长的二维数组,
嵌套二次,便是定长的三位数组。

这里需要注意的是如何打印

#include<iostream>
#include<array>
using namespace std;

int main()
{
	array<array<int, 4>, 3> date;  //表示 3X4的二维数组

	for (int i = 0; i < date.size(); i++) // date.size()表示行的大小
	{
		for (int j = 0; j < date[i].size(); j++)  // date[i].size(),表示列的大小
		{
			date[i][j] = i;     //随便赋的值
			cout << date[i][j] << " ";
		}
		cout << endl;
	}
	array<array<array<int, 4>, 4>, 4>;     //4X4X4的三维数组,可以无限嵌套

	system("pause");

	return 0;
}

victor(动态数组)

简单介绍

数组的大小是动态的,你想要多大,系统就会给你多大
当然容器, 也需要使用这个的头文件

#include<vector>

创建方式

vector的创建方式有很多

1.不带长度的创建
第一种情况:不赋初值
这种情况的创建,需要注意的是不能利用数组下标来进行操作
错误案例:

//创建方式
	//1. 不带长度的构建,
    //如果没有进行赋初值, 不能通过数组下标进行访问元素
	vector<int> name;
	name[0] = 1; //错误案例

第二种情况: 赋初值, 赋初值可以通过数组下标来操作(系统会自动给出数组的大小), 但不能越界进行操作
案例:

//错误案例
vector<int>name2 = {1, 2}; //系统自己自动给出数组大小为2
name2[3] = 1;  //越界进行操作, 程序中断

2.带长度的构建
(可以通过数组下标访问,但肯定不能越界)

//2.带长度的构建
	//创建方式:vector<数据类型> 名称(数组的大小)
	vector<int> name2(2);

	name2[0] = 1;  //正确案例, 在数组长度的范围之类
	name2[3] = 3;  //错误案例, 超出了数组的长度

3.带自动增长功能的是在成员函数中实现的
利用 push_back(尾部插入, 也就是最后面插入)

像前面几种情况, 如果越界或者无法通过数组下标来操作的话,都可以通过push_back()函数来进行插入

案例:
push_back(插入的数据);

name1.push_back(1);
name2.push_back(3)

遍历方式(这里介绍一种方便的新式for循环)

第一种:根据C++11的特性
这里有一种新式的for循环
这种新式的for循环,相对于,迭代器的方法更加的简洁,
建议使用这种,当然前面array的遍历也可以用这个,

for (auto &v: name2) //取地址
	{
		cout << v << endl; //将name2中的元素从第一个挨个打印
	}

第二种:迭代器的方法



	//迭代器的方法打印
	for (vector<int>::iterator it = name2.begin(); it != name2.end(); it++)
	{
		cout << *it << endl;
	}

逆向访问

//逆向打印
	for (vector<int> ::reverse_iterator rit = name2.rbegin(); rit != name2.rend(); rit++)
	{
		cout << *rit << endl;
	}

数组遍历的小总结

通过array和vector的遍历学习,相信你已经有所体会
遍历的方式:一般采用
1.新式的for循环
2.迭代器的方法

3.或者使用size()成员函数,挨个遍历打印

逆向遍历
反向迭代器

访问第一个元素

//1.可以通过成员函数begin()和front()
cout << name2.front() << * name2.begin();
//2.也可以通过 c成员函数at(0)
cout << name2.at(0) << endl; 
//注意不能使用rend()函数去访问,程序会中断

访问最后一个元素

1.成员函数 back()
//同样注意:注意不能使用rend()函数去访问,程序会中断
cout << name2.back();
2.反向迭代器 rbegin();
cout << *name2.rbegin()<< endl;
3.
cout << name2.at(name2.size()- 1) << endl;
4.
cout << *(name2.end() - 1) << endl;

vector的嵌套

vector本身是一个动态的数组,
嵌套一次,便是动态的二维数组,
嵌套二次,便是动态的三位数组。

这里使用了随机数的方法,实现一个不等长的二维数组
如果对随机数不太熟悉的话可以看下,当然要加头文件(这里只是部分代码)

include<time.h>
vector<vector<int>> date; //一个动态的二维数组

	srand((unsigned int)time(NULL)); //创建随机种子

	//利用随机数, 实现一个不等长的二维数组

	int len = rand() % 5 + 1;

	for (int i = 0; i < 3; i++)
	{
		vector<int> name;

		for (int j = 0; j < len; j++)
		{
			name.push_back(j);
		}
		date.push_back(name);
	}

	for (int i = 0; i < date.size(); i++)
	{
		for (int j = 0; j < date[i].size(); j++)
		{
			cout << date[i][j] << " ";
		}
		cout << endl;
	}

vector与array的相互嵌套

vector与array的相互嵌套也很简单,
弄清楚了array的嵌套和vector的嵌套
他们的相互嵌套就很好理解
只需清楚,是谁嵌套谁文章来源地址https://www.toymoban.com/news/detail-406579.html

	//array与vector 可以相互嵌套

	vector<array<int, 3>> arr1;
	arr1.push_back(array<int, 3>{0,4});
	

	array<vector<int>, 3> arr2;

	arr2[0] = vector<int>{ 1, 2 };


到了这里,关于STL容器篇之array与vector(学习篇)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第一百二十三天学习记录:C++提高:STL-vector容器(下)(黑马教学视频)

    功能描述: 对vector容器进行插入、删除操作 函数原型: 总结: 尾插 push_back 尾删 pop_back 插入 insert(位置迭代器) 删除 erase(位置迭代器) 清空 clear 功能描述: 对vector中的数据的存取操作 函数原型: 总结: 除了用迭代器获取vector容器中元素,[]和at也可以 front返回容器第一个

    2024年02月13日
    浏览(45)
  • STL : vector 矢量容器

    目录 Vector Capacity Elements access Modifiers Allocator Non-member Notice overloads Template specializations #includevector    using namespace std; 矢量容器 :单向开口的连续内存空间,底层封装:数组; 预留内存空间不够时,可以动态扩展(容器满了则新建容器同时进行拷贝); 顺序序列:容器元素按

    2023年04月15日
    浏览(43)
  • 详解c++STL—容器vector

    功能: vector数据结构和 数组非常相似 ,也称为 单端数组 vector与普通数组的区别: 不同之处在于数组是静态空间,而vector可以 动态扩展 动态扩展: 并不是在原空间之后续接新空间,而是 找更大的内存空间,将原数据拷贝到新空间,释放原空间 功能描述: 创建vector容器

    2024年02月05日
    浏览(44)
  • C++提高编程——STL:string容器、vector容器

    本专栏记录C++学习过程包括C++基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下, 不定时更新,欢迎关注 。 当前章节处于: ---------第1阶段-C++基础入门 ---------第2阶段实战-通讯录管理系统, ---------第3阶段-C++核心编程, -----

    2024年01月23日
    浏览(49)
  • C++ —— STL容器【vector】模拟实现

    本章代码gitee仓库:vector模拟实现、vector源码 看源码发现 vector 是类模板定义的,成员是采用迭代器进行管理 当涉及到容器类时,通常有一些关键函数,如构造函数、析构函数和拷贝构造函数,它们负责初始化容器对象、销毁对象和进行对象的拷贝等 这里注意拷贝构造要实现

    2024年02月16日
    浏览(46)
  • 【C++STL】模拟实现vector容器

    本文带你进入vector的模拟实现,对于vector,是我们深入学习STL的必要途径。 根据库的实现方式,成员函数如下: c++11开始可以对成员变量使用缺省值,在这里我们可以使用缺省值。 size的大小为_finish - _start capacity的大小为_end_of_storage - _start 该函数的作用是:扩容。 思路:

    2024年02月16日
    浏览(37)
  • C++STL:顺序容器之vector

    vector 容器是 STL 中最常用的容器之一,它和 array 容器非常类似,都可以看做是对 C++ 普通数组的“升级版”。不同之处在于,array 实现的是静态数组(容量固定的数组),而 vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的

    2024年02月13日
    浏览(41)
  • 【C++STL】“vector“容器的模拟实现

    🎉博客主页:小智_x0___0x_ 🎉欢迎关注:👍点赞🙌收藏✍️留言 🎉系列专栏:C++初阶 🎉代码仓库:小智的代码仓库 这里的 iterator 是 typedef T* iterator; 定义来的, T 是模板参数。 _start 是指向开始的指针变量。 _finish 是指向最后一个元素的下一位的指针变量。 _endofstorage 是

    2024年02月16日
    浏览(41)
  • C++ stl容器vector的底层模拟实现

    目录 前言:   1.成员变量,容量与大小 2.构造函数 无参构造: 带参的使用值进行构造:  使用迭代器区间进行构造: 3.交换 4.拷贝构造 5.赋值重载 6.迭代器 7.扩容 reserve: resize: 8.插入与删除 insert: erase: insert迭代器失效问题: erase迭代器失效问题: 9.头插头删 10.[]重载

    2024年04月15日
    浏览(42)
  • STL标准模板库 vector容器与迭代器入门

    vector 就是一个连续的数据 C++11 std::vector a ={1,4,2,6,7}; 可以使用花括号来定义 容器的功能就是存储数据 迭代器的功能就是指向数据,并且可以实现前后移动(指针)算法和容器的接口的存在 vector功能是长度可变的数组, 身在栈上 里面的数据存储在堆上 因为栈不可动态扩容

    2023年04月23日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包