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



相关文章
|
1天前
|
存储 缓存 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 的奥秘,从入门到高效编程
|
2月前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
101 0
|
4月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
104 2
|
4月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
103 2
|
4月前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
91 5
|
6月前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针
|
7月前
|
存储 算法 C语言
【C++】详解STL的适配器容器之一:优先级队列 priority_queue
【C++】详解STL的适配器容器之一:优先级队列 priority_queue
|
7月前
|
设计模式 存储 缓存
【C++】详解STL容器之一的deque和适配器stack,queue
【C++】详解STL容器之一的deque和适配器stack,queue
|
7月前
|
存储 算法 C++
【C++】详解STL容器之一的 vector
【C++】详解STL容器之一的 vector
|
7月前
|
算法 C语言 C++
【C++】详解STL的容器之一:list
【C++】详解STL的容器之一:list