[C++ 从入门到精通] 4.vector容器的相关用法

简介: [C++ 从入门到精通] 4.vector容器的相关用法

一. Vector类型简介

  • C++标准库:是类库和函数的集合,其使用核心语言写成,由C++标准委员会制定,并不断维护更新。
  • Vector类型C++标准库中的一员,它是能把其他对象装进来的一个集合或者动态数组,也被称为容器

二. 定义和初始化Vector类型简介

1、 使用Vector类型前要:

#include <vector>
using namespace std;     //不包含该命名空间的话,需要使用std::vector声明

2、 定义和初始化Vector对象:

格式vector<数据类型> 对象名; ——数据类型可以是整型int、字符类型string、点集point、结构类型struct等。

初始化方式

空vector初始化,并向容器中存入数据——push_back(常用)

vector<string> str;    //创建一个string类型的空的vector对象(容器)
str.push_back("abc");
str.push_back("def");

可以看到str容器中存入了上面的两组数据:

元素拷贝初始化

vector<string> str2(str);    //把str元素拷贝给str2
vector<string> str3 = str;   //把str元素拷贝给str2,两者等价

{}列表方式初始化 —— C++11中的标准。Ps:一般用大括号表示对象中元素内容这么个概念

vector<string> str4 = {"aaa", "bbb", "ccc"}   //创建包含3个string类型的元素数组,分别是"aaa", "bbb", "ccc"
vector<int> num{10,20};                       //创建包含2个int类型的元素数组,分别是10,20
vector<int> num2{10};                         //创建包含1个int类型的元素数组,值为10

创建指定数量的元素初始化(不常用,理解即可)。Ps:一般用圆括号表示对象中元素数量这么个概念

vector<string> str5(5,"Hi");  //创建包含5个string类型的元素数组,每个元素的值是Hi
vector<int> num3(10,10);      //创建包含10个int类型的元素数组,每个元素的值是20;
vector<int> num4(10);         //创建包含10个int类型的元素数组,每个元素值是缺省的0;

三. Vector对象的操作

Vector容器的使用中,常用逻辑是先创建一个空的Vector对象(上面的第一种初始化方式),然后往这个容器中动态增加/减少元素。

.empty() —— 判断容器是否为空,返回值为bool类型

vector<int> num;
if(num.empty())
{
    qDebug() << "num为空";
}

.push_back() —— 向vector中的末尾增加一个元素

vector<int> num2;
for(int i =1; i<=100; i++)
{
    num2.push_back(i);    //向容器num2中分别存入1...100元素,下面的例子都以该容器中值为例
}

.size() —— 返回元素的个数

qDebug() << "num2中的元素个数" << num2.size();    //值为100

.clear() —— 清空容器中的元素

num2.clear();
qDebug() << "num2中的元素个数" << num2.size();    //num2中元素个数清空变为0

num2[n] —— 返回容器num2中的第n个元素,下标从0开始,num2.size()-1结束

int value = num2[0];     //value值为1
int value1 = num2[1];    //value1值为2

auto —— 范围forvector中的应用(auto后面跟&)(常用

vector<int> num3
vector<int> num4{ 1,2,3,4 };
for(auto &temp : num4)        //保持习惯,尽量使用引用&,相比较于赋值效率更高
{
    num3.push_back(temp);     //遍历容器num4中的每个数据,依次存入容器num3中
}
//若要修改容器中的数据,也一定要用引用&+范围for语句的形式
for(auto &temp1 : num4)
{
    temp1 *= 2;
    num3.push_back(temp1);    //遍历容器num4中的每个数据,*2后依次存入容器num3中,结果为2,4,6,8四组数据
}

四. 范围for进一步讲解

1、假设我本意是输出容器中的所有值

vector<int> num4{ 1,2,3,4 };
for(auto temp2 : num4)
{
    qDebug() << temp2;  
}

2、但是若在范围for语句中又对正在遍历的容器中插入了其他元素,导致遍历的值发生改变,比如:

for(auto temp2 : num4)
{
    num4.push_back(88);
    qDebug() << temp2;    
}

这会导致编译器运行时轻则输出元素值错乱,重则直接崩溃:Expression: vector iterator not incrementable(向量迭代器不可递增)。

崩溃原因

在第一次执行范围for语句时,系统会先记录遍历的容器结束的位置值,比如上面容器num4中,结束的位置值就是4,在for循环过程中一旦遍历到这个结束值4,系统会认为遍历结束并自动退出for循环。

那么我们在for循环遍历容器的过程中,一旦中途对这个容器中的值进行增/减操作,比如屁股上插个值或删除了里面的某个元素,会导致容器的中结束位置发生了改变,那么for循环输出的值就会发生错乱或系统崩溃。

结论:

for循环语句中(遍历一个容器等类似操作中),千万不要改动vector容器的容量,包括对容器进行增加/删除等操作都不可以。


下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。


目录
相关文章
|
2月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
111 2
|
2月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
66 4
|
2月前
|
Kubernetes Cloud Native 开发者
云原生入门:从容器到微服务
本文将带你走进云原生的世界,从容器技术开始,逐步深入到微服务架构。我们将通过实际代码示例,展示如何利用云原生技术构建和部署应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和启示。
|
2月前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
17天前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
39 0
|
21天前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
30 0
|
2月前
|
Cloud Native 持续交付 Docker
Docker容器化技术:从入门到实践
Docker容器化技术:从入门到实践
|
2月前
|
Cloud Native 持续交付 云计算
云原生入门指南:从容器到微服务
【10月更文挑战第28天】在数字化转型的浪潮中,云原生技术成为推动现代软件开发的关键力量。本篇文章将带你了解云原生的基本概念,探索它如何通过容器化、微服务架构以及持续集成和持续部署(CI/CD)的实践来提升应用的可伸缩性、灵活性和可靠性。你将学习到如何利用这些技术构建和部署在云端高效运行的应用,并理解它们对DevOps文化的贡献。
59 2
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
2月前
|
运维 Kubernetes Cloud Native
云原生入门:Kubernetes和容器化的未来
【10月更文挑战第23天】本文将带你走进云原生的世界,探索Kubernetes如何成为现代软件部署的心脏。我们将一起揭开容器化技术的神秘面纱,了解它如何改变软件开发和运维的方式。通过实际的代码示例,你将看到理论与实践的结合,感受到云原生技术带来的革命性影响。无论你是初学者还是有经验的开发者,这篇文章都将为你开启一段新的旅程。让我们一起踏上这段探索之旅,解锁云原生技术的力量吧!