C++中Vector和数组区别
数组
数组是存放类型相同的对象的容器,数组的大小确定不变,不能随意向数组中增加元素。
定义和初始化
- 数组的大小不变,(a[d],d为数组的维度),数组的维度必须是一个常量表达式。定义数组的时,必须指定数组的类型和大小。
- 初始化时,允许不指明数组的维度,不指明维度,则编译器根据数组初始值的大小推测出维度;
- 当定义字符串数组时结尾还会有一个空字符,数组大小等于字面值加一
!!!
数组不允许拷贝和赋值
数组操作
获取数组元素个数
- 静态sizeof(arr)/sizeof(arr[0])
- 动态必须手动记录
扩容:手动扩容(申请新内存→拷贝→释放旧内存)
删除元素:手动移动后续元素覆盖,动态数组需手动调整大小
遍历: 下标循环 / 指针循环
排序:std::sort(arr, arr+n)(传首 / 尾地址,需 <algorithm>)
传参:退化为指针,需手动传大小:void func(int arr[], int n)
向量vector
vector在C++中时类模版,是类型相同对象的容器,vector的大小可以变化。
vector的size和capacity
size指vector容器当前拥有的元素个数,capacity指容器在必须分配新存储空间之前可以存储的元素总数,capacity总是大于或等于size的。
vector操作
各种初始化
| 初始化语句 | 实现效果 |
|---|---|
| vector |
v1为空 |
| vector |
v2中包含v1所有元素的副本 |
| vector |
等价于v2(v1) |
| vector |
v3中包含n个重复元素,每个元素的值都是val |
获取大小
内置方法:vec.size()(元素个数)、vec.capacity()(内存容量)
访问元素
:两种方式:
vec[index](无检查,同数组)
vec.at(index)(有检查,越界抛异常)
传参
vector 传参:可直接保留大小信息(通过 vec.size()),无需额外传参,且支持灵活的传递方式(控制是否拷贝、是否允许修改原向量)。
主要有 值传递、非 const 引用传递、const 引用传递 三种方式,不同方式对应不同的使用场景,优先级:const 引用 > 非 const 引用 > 值传递。
- const 引用传递(只读场景),禁止函数内修改原向量
const vector<int>& vec - 非 const 引用传递(修改场景):传递 vector 的引用,允许函数内修改原向量。
vector<int>& vec - 值传递(拷贝传递):修改副本不会影响原 vector,效率极低
vector<int> vec
添加元素
末尾添加:vec.push_back(elem)
指定位置添加:vec.insert(vec.begin()+i, elem)
排序std::sort(vec.begin(), vec.end())(传迭代器,需 <algorithm>
清空vec.clear()(清空元素,保留容量)
vec.swap(vector


