今天学习了C++中的vector容器,它提供动态数组功能,方便管理和存储数据。支持动态调整大小,简化了数组操作,使代码更灵活、高效。实在是太牛了,后悔没有早点学习容器。
目录
一、vector简介
二、头文件和命名空间
三、vector的基本用法
(1)初始化
(2)访问元素
(3)遍历所有元素
(4)添加元素
四、vector和数组的区别
一、vector简介
数组尽管很灵活,但使用起来还是很多不方便。为此,C++语言定义了扩展的“抽象数据类型”,放在“标准库”中。
对数组功能进行扩展的一个标准库类型,就是“容器”vector。顾名思义,vector“容纳”着一堆数据对象,其实就是一组类型相同的数据对象的集合。
std::vector
是 C++ 标准库提供的一个动态数组容器,用于存储一系列连续的元素。
二、头文件和命名空间
vector是标准库的一部分。要想使用vector,必须在程序中包含<vector>头文件,并使用std命名空间。
#include <vector> using namespace std;
在vector头文件中,对vector这种类型做了定义;使用#include引入它之后,并指定命名空间std之后,我们就可以在代码中直接使用vector了。
三、vector的基本用法
vector其实是C++中的一个“类模板”,是用来创建类的“模子”。所以在使用时还必须提供具体的类型信息,也就是说,这个容器中到底要容纳什么类型的数据对象;具体的形式是在vector后面跟一个尖括号<>,里面填入具体类型信息。
#include <vector> using namespace std; vector<int> v1;
(1)初始化
#include <iostream> #include <vector> using namespace std; int main() { // 默认初始化,不含任何元素 vector<int> v1; // 列表初始化 vector<char> v2 = { 'a', 'b', 'c' }; // 省略等号的列表初始化 vector<short> v3{1, 2, 3, 4, 5}; // 只定义长度,元素初值默认初始化,容器中有5个0 vector<int> v4(5); // 定义长度和初始值,容器中有5个100 vector<long> v5(5, 100); return 0; }
这里有几种不同的初始化方式:
- 默认初始化一个vector对象,就是一个空容器,里面不含任何元素;
- C++ 11之后可以用花括号括起来的列表,对vector做初始化;等号可以省略;这种方式是把一个列表拷贝给了vector,称为“拷贝初始化”
- 可以用小括号表示初始化vector的长度,并且可以给所有元素指定相同的初始值;这种方式叫做“直接初始化”
(2)访问元素
同样可以用下标操作符来获取对应索引的元素,这一点跟数组非常相似。
需要注意:
- vector内元素的索引,也是从0开始;
- vector索引最大值为 (vector长度 - 1),不能越界访问;如果直接越界访问并赋值,有可能导致非常严重的后果,出现安全问题
(3)遍历所有元素
vector中有一个可以调用的函数size(),只要调用它就能直接得到vector的长度(即元素个数):
调用的方式是一个vector对象后面跟上一个点,再跟上size()。这种基于对象来调用的函数叫做“成员函数”。
(4)添加元素
vector的长度并不是固定的,所以可以向一个定义好的vector添加元素。
这里的push_back同样是一个成员函数,调用它的时候在小括号里传入想要添加的数值,就可以让vector对象中增加一个元素了。
这就使得我们在创建vector对象时不需要知道元素个数,使用更加灵活,避免了数组中的缺陷。
四、vector和数组的区别
大小调整:
- 数组:数组的大小在创建时就确定了,后续无法改变,即静态大小。如果需要调整数组大小,需要重新创建一个新的数组并拷贝数据。
- vector:
vector
的大小是动态调整的,可以根据需要随时增加或减少元素,即动态大小。vector
会自动处理内部的内存管理,避免了手动重新分配内存的麻烦。内存管理:
- 数组:数组在栈上分配内存,通常具有较小的容量。对于大型数组,可能会导致栈溢出,因此通常使用堆内存动态分配。
- vector:
vector
在堆上分配内存,可以存储更大量的数据,并且自动处理内存管理,不需要手动释放内存。增删元素的效率:
- 数组:在数组中插入或删除元素比较低效,因为需要移动其他元素来填补空位。
- vector:
vector
的插入和删除元素的操作相对高效,特别是在尾部进行插入和删除操作。但在中间或头部进行插入和删除,仍然涉及元素的移动。参数传递:
- 数组:数组作为函数参数传递时,通常会退化为指针,丧失了长度信息,需要额外传递数组长度参数。
- vector:
vector
可以作为函数参数传递,它包含了自身的长度信息,无需额外传递大小。STL功能:
- 数组:C++ 原生数组不是标准库的一部分,没有提供丰富的容器功能。
- vector:
vector
是 C++ 标准库提供的容器,拥有丰富的操作函数,可以方便地进行元素访问、插入、删除等操作。综上所述,
vector
相对于数组来说更加灵活和方便,特别适用于需要动态管理大小和使用丰富容器功能的场景。而数组则更适用于静态大小和对内存管理有特殊要求的情况。
在学习和使用std::vector
这个强大的C++容器时,我深刻体会到其灵活性和便利性。std::vector
能够动态调整大小、支持随机访问,简化了数组操作和内存管理。它在各种场景下都发挥着重要的作用,让我们】在编程的世界中更加得心应手。