C++数组和向量:

C++数组和向量:

数组 (Array)

数组是固定大小的连续内存块,在编译时确定大小。它们在内存中是静态分配的,意味着大小不可改变。

声明和初始化数组

int arr[5] = {1, 2, 3, 4, 5}; //声明并初始化一个包含5个整数数组

优点:

  • 性能高:数组的访问速度较快,因为它们在内存中是连续的。

  • 内存占用少:没有额外的开销

缺点:

  • 大小固定: 一旦声明,数组的大小不可更改。

  • 不便于扩展:如果需要增加元素,必须手动创建一个新的更大的数组并复制原数组的内容。

std::array (C++11引入)

std::array是C++11中引入的一个容器,它结合了数组的固定大小和C++标准库容器的优势。与传统C++数组不同,std:array提供了许多容器的功能(比如 .size(), .begin(), .end()), 但它仍然是一个大小固定的容器。

声明和初始化std::array

std::array是一个模版类,我们需要指定存储元素的类型和数组的大小

#include <array>
using namespace std;

array<int, 5> arr = {1, 2, 3, 4, 5};

std::array的特点:

  1. 固定大小: std::array在编译时确定大小, 大小一旦定义就不能改变

  2. 提供更多的功能: 它提供了许多类似于其他STL容器(如std::vector)的成员函数,如 .size(), .begin(), .end()等。

  3. 内存管理:它是一个栈上的容器,没有额外的内存管理开销

  4. 性能和数组相似:与传统数组类似,它的元素存储在连续的内存块中,访问性能高。

std::array的常用操作:

  1. size():返回数组的元素个数

  2. at(): 安全地访问元素(越界时抛出异常)

  3. front()和back(): 分别返回数组的第一个和最后一个元素。

  4. fill(): 用一个值填充整个数组。

  5. begin()和end(): 返回数组的迭代器,用于遍历。

向量(Vector)

std::vector 是C++标准库提供的动态数组容器。它的大小是动态可变的,可以随着元素的添加或删除而自动调整大小。与普通数组相比,vector提供了更多的灵活性和功能。

声明和初始化向量

#include <vector>
using namespace std;

vector<int> vec = {1, 2, 3, 4, 5}; //初始化一个包含5个整数的向量

向量的动态调整大小

vector会自动拓展或收缩,因此不需要提前指定大小

vec.push_back(6); //向向量末尾添加元素
vec.pop_back(); //删除向量末尾的元素

优点:

  • 动态大小:向量可以随时添加或减少元素

  • 灵活性:提供了很多内置方法,如push_back, pop_back, insert, erase等, 便于操作。

  • 内存管理:vector自动处理内存的分配和释放

总结:std::array vs. 数组和 std::vector

特性数组(Array)std::arraystd::vector
大小固定的,编译时定义固定的,编译时定义动态的,运行时调整大小
内存管理手动管理手动管理自动管理
访问方式使用下标访问使用下标,迭代器等访问使用下标,迭代器,push_back等操作
提供的功能基本操作([], sizeof)提供了STL容器的常见操作动态拓展,插入,删除等操作
性能高效高效较低,尤其在扩容时