vector和数组(使用[]定义)有以下关系和区别

一、关系

  1. 存储数据:

    • 两者都可以用来存储一组相同类型的数据。例如,可以用数组存储一组整数int arr[5],也可以用vector<int> v存储一组整数。

  2. 访问元素:

    • 都支持通过下标访问元素,例如arr[2]v[2]都可以访问相应集合中的第三个元素(下标从 0 开始)。

二、区别

  1. 内存管理:

    • 数组:在定义时必须指定大小,且大小固定,不能动态改变。一旦分配内存,大小就不能再改变。如果需要更多的空间,必须手动重新分配和复制数据。

    • vector可以动态地添加和删除元素,自动管理内存。当需要更多空间时,会自动分配更大的内存块,并将现有元素复制到新的内存区域。

  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_backpop_backsizeclear等,用于添加、删除元素和获取容器的状态信息。数组没有这些内置的操作函数。

Last updated