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



相关文章
|
8天前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
125 5
|
8月前
|
存储 缓存 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`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
194 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
10月前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
495 0
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
195 5
|
Kubernetes Linux 持续交付
docker容器学习
【10月更文挑战第1天】
143 1
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
199 2
|
3月前
|
测试技术 PHP 开发者
PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
|
7月前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
399 1
Java 中数组Array和列表List的转换
|
7月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章

  • 1
    Java 中数组Array和列表List的转换
    399
  • 2
    JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
    452
  • 3
    通过array.reduce()实现数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式、聚合统计、处理树结构数据和性能优化,reduce()的使用详解(附实际应用代码)
    1035
  • 4
    通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
    293
  • 5
    通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
    172
  • 6
    多维数组操作,不要再用遍历循环foreach了!来试试数组展平的小妙招!array.flat()用法与array.flatMap() 用法及二者差异详解
    115
  • 7
    别再用双层遍历循环来做新旧数组对比,寻找新增元素了!使用array.includes和Set来提升代码可读性
    116
  • 8
    Array.forEach实战详解:简化循环与增强代码可读性;Array.forEach怎么用;面对大量数据时怎么提高Array.forEach的性能
    93
  • 9
    深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
    301
  • 10
    JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
    557
  • 下一篇
    oss教程