? ? 定义:vector是一个动态数组,可以存储各种类型的元素。它是一个标准库容器(container),位于< vector>头文件中,是STL容器中功能最强大、使用最广泛的容器之一,用于存储和操作动态大小的元素序列。
?常用来做什么:
存储和管理数据:vector可以存储各种数据类型的元素,例如整数、浮点数、字符串等。它提供了方便的方法来添加、删除和访问元素,使得数据的存储和管理变得简单。
动态数组:vector可以用作动态数组,可以根据需要自动分配和释放内存。它提供了快速的随机访问和在末尾进行插入、删除等操作。
作为函数参数和返回值:vector可以作为函数的参数或返回值,方便传递和返回多个元素。
管理对象的集合:vector可以存储类对象的集合,这使得它在管理和操作对象集合方面非常有用。
实现算法和数据结构:vector是许多算法和数据结构的基础,例如排序、查找、堆栈、队列等。
存储数据的变化序列:vector可以用于存储数据的变化序列,例如一系列的历史记录或事件。
std::vector<T> vec;
这种写法创建了一个初始为空的vector
std::vector<T> vec = {elem1, elem2, elem3, ...};
这种写法使用初始化列表将元素逐个添加到vector中。
std::vector<T> vec(otherVec);
这种写法使用另一个vector?otherVec
?初始化新的vector?vec
,并且两个vector的元素类型必须相同。
std::vector<T> vec(firstIterator, lastIterator);
这种写法使用迭代器范围?[firstIterator, lastIterator)
?的元素进行初始化。
当容器中元素数量达到其当前大小时,容器会自动扩展其大小以容纳更多的元素。
可以用类似于数组下标的方式快速随机访问容器中的元素。
可以用push_back方法方便地在 vector 中插入元素,用pop_back方法删除最后一个元素。
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。提供了在序列末尾相对快速地添加/删除元素的操作。
容器使用一个内存分配器对象来动态地处理它的存储需求。
push_back():在vector末尾添加一个元素。
pop_back():删除vector最后一个元素。
at():返回vector中指定位置的元素。
size():返回vector中元素的数量。
begin():返回一个指针,指向vector的第一个元素。
end():返回一个指针,指向vector最后一个元素的下一个位置。
vector<T> v:创建一个空vector,元素类型为T。
vector(v.begin(), v.end()):用v中区间[v.begin(), v.end())的元素构造新的vector。
vector(n, elem):创建一个具有n个elem元素的vector。
a = b:将vector b的元素赋值到vector a中。
a.assign(b.begin(), b.end()):用区间[b.begin(), b.end())中的元素创建新的vector并赋值给vector a。
a.assign(n, elem):重新分配vector a的大小为n,并用元素elem进行赋值。
a.swap(b):交换vector a和 vector b 的元素。
a.begin():返回指向vector a的第一个元素的迭代器。
a.end():返回指向vector a最后一个元素下一位置的迭代器。
a.front():返回vector a第一个元素的引用。
a.back():返回vector a最后一个元素的引用。
a.push_back(elem):在vector a的末尾添加一个元素。
a.pop_back():删除vector a的最后一个元素。
a.insert(n_pos, elem):在位于n_pos的位置插入一个元素elem。
a.insert(n_pos, n, elem):在位于n_pos的位置插入n个元素elem。
a.insert(n_pos, v.begin(), v.end()):在位于n_pos的位置插入v中区间[v.begin(), v.end())的元素。
a.erase(n_pos):移除vector a中指定位置的元素。
a.erase(n_first, n_last):移除vector a中区间[n_first, n_last)的元素。
a.empty():如果vector a的大小为0,则返回true。
a.size():返回vector a的元素数量。
a.resize(n):将vector a的大小调整为n,如果当前元素数量小于n,用默认值填充新的元素。
a.resize(n, elem):将vector a的大小调整为n,如果当前元素数量小于n,用elem填充新的元素。
a.reserve(n):将vector a的容量调整为n,如果当前容量小于n,则进行相应的扩容。
算法函数需要在 <algorithm> 头文件中添加。
std::sort(a.begin(), a.end()):使用快速排序对vector a中元素进行排序。
std::reverse(a.begin(), a.end()):将vector a中的元素逆序排列。
std::find(a.begin(), a.end(), elem):在vector a中查找指定元素elem,返回其迭代器。
std::count(a.begin(), a.end(), elem):在vector a中计算指定元素elem的数量。
快速随机访问:vector支持常数时间 O(1) 的随机访问,能够通过下标访问元素。
动态扩容:vector能够自动动态扩容,能够根据需要自动增加或减少存储空间,使其适应元素数量的变化。
连续存储:vector存储元素是在连续的内存中,所以存储密度高、CPU缓存效率高,访问速度相对较快。
插入删除效率高:在vector的末尾插入和删除元素的效率较高,时间复杂度为 O(1)。
缺点:
不能快速在任意位置进行插入或删除:向 vector 中间位置插入或者删除元素时间复杂度为 O(N),这是因为需要进行数据移动,可能造成较大的性能损失。
存储空间浪费:vector动态扩展时,需要重新分配连续存储空间,并将原有数据移到新的存储空间中,旧的空间将被释放,造成空间浪费。
无法存储不同类型的元素:vector中的元素类型必须相同。
无法自动排序:vector不会对元素进行自动排序。
? ? ? ?vector在随机访问、末尾元素插入、删除、动态扩容方面具有良好的性能,但它的限制也是不可忽视的。在使用vector时应该根据具体的需求,权衡其优缺点,并做出合理的选择。