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

简介: STL容器篇之array与vector(学习篇)(下)

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的嵌套

他们的相互嵌套就很好理解

只需清楚,是谁嵌套谁

//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 };



相关文章
|
移动开发 前端开发 HTML5
Twaver-HTML5基础学习(20)数据容器(3)_数据的批量加载(节省性能方法)
本文介绍了Twaver HTML5中数据的批量加载方法,通过使用`box.startBatch()`可以在大量数据加载时提高性能。文章通过示例代码展示了如何在React组件中使用批量加载功能,以减少界面重绘次数并提升效率。
394 2
Twaver-HTML5基础学习(20)数据容器(3)_数据的批量加载(节省性能方法)
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
1113 6
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
367 1
|
存储 C++ 容器
如何将没有复制或移动构造函数的对象放入vector容器
如何将没有复制或移动构造函数的对象放入vector容器
305 0
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
1146 1
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
459 9
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
移动开发 HTML5 容器
Twaver-HTML5基础学习(21)网元管理容器(ElementBox)
本文介绍了Twaver HTML5中的网元管理容器(ElementBox),包括如何监听网元属性变化、容器属性变化、网元元素变化以及数据层次变化。文章通过示例代码展示了如何使用不同的事件监听方法来响应这些变化,并通过控制台输出相关的事件信息。
340 4
Twaver-HTML5基础学习(21)网元管理容器(ElementBox)
|
移动开发 前端开发 HTML5
Twaver-HTML5基础学习(23)页管理容器(TabBox)、选中模型(SelectionModel)
本文介绍了Twaver HTML5中的页管理容器(TabBox)和选中模型(SelectionModel)。文章解释了如何使用TabBox来管理Tab页,并通过示例代码展示了SelectionModel的多种功能,包括追加选中元素、设置选中元素、选中所有元素、移除元素选中状态、清除所有选中状态等。此外,还介绍了如何监听选中状态的变化事件以及如何设置不同的选中模式,如多选、单选和不可选。
330 2
Twaver-HTML5基础学习(23)页管理容器(TabBox)、选中模型(SelectionModel)
|
XML 移动开发 JSON
Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
本文介绍了Twaver HTML5中的数据容器(DataBox),包括如何进行增删查改操作、遍历数据容器以及判断网元是否存在于数据容器中。DataBox用于管理所有的网元对象,如ElementBox、LayerBox、AlarmBox等,并通过示例代码展示了其常用方法的使用。
289 1
Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
1605 8

热门文章

最新文章

  • 1
    PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
    407
  • 2
    Java 中数组Array和列表List的转换
    1190
  • 3
    JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
    871
  • 4
    通过array.reduce()实现数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式、聚合统计、处理树结构数据和性能优化,reduce()的使用详解(附实际应用代码)
    1682
  • 5
    通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
    872
  • 6
    通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
    612
  • 7
    多维数组操作,不要再用遍历循环foreach了!来试试数组展平的小妙招!array.flat()用法与array.flatMap() 用法及二者差异详解
    461
  • 8
    别再用双层遍历循环来做新旧数组对比,寻找新增元素了!使用array.includes和Set来提升代码可读性
    430
  • 9
    Array.forEach实战详解:简化循环与增强代码可读性;Array.forEach怎么用;面对大量数据时怎么提高Array.forEach的性能
    313
  • 10
    深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
    944