# vector和数组（使用\[]定义）有以下关系和区别

**一、关系**

1. 存储数据：
   * 两者都可以用来存储一组相同类型的数据。例如，可以用数组存储一组整数`int arr[5]`，也可以用`vector<int> v`存储一组整数。
2. 访问元素：
   * 都支持通过下标访问元素，例如`arr[2]`和`v[2]`都可以访问相应集合中的第三个元素（下标从 0 开始）。

**二、区别**

1. 内存管理：
   * 数组：<mark style="color:orange;">在定义时必须指定大小，且大小固定</mark>，不能动态改变。一旦分配内存，大小就不能再改变。如果需要更多的空间，必须手动重新分配和复制数据。
   * `vector`：<mark style="color:red;">**可以动态地添加和删除元素，自动管理内存**</mark>。当需要更多空间时，会自动分配更大的内存块，并将现有元素复制到新的内存区域。
2. 安全性：
   * 数组：不进行边界检查，当下标超出范围时可能导致未定义行为，如访问非法内存地址，可能导致程序崩溃。
   * `vector`：进行边界检查，通过`at()`成员函数访问元素时，如果下标越界会抛出异常，相对更安全。
3. 初始化方式：
   * 数组：可以使用初始化列表进行初始化，例如`int arr[] = {1, 2, 3}`。也可以不初始化，此时数组中的元素的值是未定义的。
   * `vector`：可以使用多种方式初始化，例如`vector<int> v = {1, 2, 3}`，或者先创建空的`vector`，然后再使用`push_back()`等函数添加元素。
4. 函数参数传递：
   * 数组：在作为函数参数传递时，实际上**传递的是指针**，函数内部无法知道数组的实际大小，容易导致错误。
   * `vector`：作为函数参数传递时，是按**值传递或者引用传递**，函数内部可以准确知道`vector`的大小和内容。
5. 容器操作：
   * `vector`是标准模板库（STL）中的容器，提供了很多方便的成员函数，如`push_back`、`pop_back`、`size`、`clear`等，用于添加、删除元素和获取容器的状态信息。数组没有这些内置的操作函数。
