数组 (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
的特点:
固定大小: std::array在编译时确定大小, 大小一旦定义就不能改变
提供更多的功能: 它提供了许多类似于其他STL容器(如std::vector)的成员函数,如 .size(), .begin(), .end()等。
内存管理:它是一个栈上的容器,没有额外的内存管理开销
性能和数组相似:与传统数组类似,它的元素存储在连续的内存块中,访问性能高。
std::array的常用操作:
size():返回数组的元素个数
at(): 安全地访问元素(越界时抛出异常)
front()和back(): 分别返回数组的第一个和最后一个元素。
fill(): 用一个值填充整个数组。
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::array | std::vector |
大小 | 固定的,编译时定义 | 固定的,编译时定义 | 动态的,运行时调整大小 |
内存管理 | 手动管理 | 手动管理 | 自动管理 |
访问方式 | 使用下标访问 | 使用下标,迭代器等访问 | 使用下标,迭代器,push_back等操作 |
提供的功能 | 基本操作([], sizeof) | 提供了STL容器的常见操作 | 动态拓展,插入,删除等操作 |
性能 | 高效 | 高效 | 较低,尤其在扩容时 |