C++ vecor容器(最全知识总结) 特性 常用函数 总结

发布时间:2023年12月25日

一、解析vector

? ? 定义:vector是一个动态数组,可以存储各种类型的元素。它是一个标准库容器(container),位于< vector>头文件中,是STL容器中功能最强大、使用最广泛的容器之一,用于存储和操作动态大小的元素序列。

?常用来做什么:

  1. 存储和管理数据:vector可以存储各种数据类型的元素,例如整数、浮点数、字符串等。它提供了方便的方法来添加、删除和访问元素,使得数据的存储和管理变得简单。

  2. 动态数组:vector可以用作动态数组,可以根据需要自动分配和释放内存。它提供了快速的随机访问和在末尾进行插入、删除等操作。

  3. 作为函数参数和返回值:vector可以作为函数的参数或返回值,方便传递和返回多个元素。

  4. 管理对象的集合:vector可以存储类对象的集合,这使得它在管理和操作对象集合方面非常有用。

  5. 实现算法和数据结构:vector是许多算法和数据结构的基础,例如排序、查找、堆栈、队列等。

  6. 存储数据的变化序列:vector可以用于存储数据的变化序列,例如一系列的历史记录或事件。

二、常见写法(其中T是vector中存储元素的类型,vec是容器名,vector包含#include<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)?的元素进行初始化。

三、容器特点

1.自动分配空间:

当容器中元素数量达到其当前大小时,容器会自动扩展其大小以容纳更多的元素。

2.高效的随机访问:

可以用类似于数组下标的方式快速随机访问容器中的元素。

3.方便的尾部插入、删除:

可以用push_back方法方便地在 vector 中插入元素,用pop_back方法删除最后一个元素。

4.顺序序列

顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。

5.动态数组

支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。提供了在序列末尾相对快速地添加/删除元素的操作。

6.能够感知内存分配器的(Allocator-aware)

容器使用一个内存分配器对象来动态地处理它的存储需求。

四、常用库函数

0.必知函数

push_back():在vector末尾添加一个元素。

pop_back():删除vector最后一个元素。

at():返回vector中指定位置的元素。

size():返回vector中元素的数量。

begin():返回一个指针,指向vector的第一个元素。

end():返回一个指针,指向vector最后一个元素的下一个位置。

1.构造函数

vector<T> v:创建一个空vector,元素类型为T。

vector(v.begin(), v.end()):用v中区间[v.begin(), v.end())的元素构造新的vector。

vector(n, elem):创建一个具有n个elem元素的vector。

2.赋值和交换

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 的元素。

3.元素访问和迭代器

a.begin():返回指向vector a的第一个元素的迭代器。

a.end():返回指向vector a最后一个元素下一位置的迭代器。

a.front():返回vector a第一个元素的引用。

a.back():返回vector a最后一个元素的引用。

4.插入和删除

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)的元素。

5.容量和大小

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,则进行相应的扩容。

6.算法函数

算法函数需要在 <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的优点与缺点

优点:

  1. 快速随机访问:vector支持常数时间 O(1) 的随机访问,能够通过下标访问元素。

  2. 动态扩容:vector能够自动动态扩容,能够根据需要自动增加或减少存储空间,使其适应元素数量的变化。

  3. 连续存储:vector存储元素是在连续的内存中,所以存储密度高、CPU缓存效率高,访问速度相对较快。

  4. 插入删除效率高:在vector的末尾插入和删除元素的效率较高,时间复杂度为 O(1)。

缺点:

  1. 不能快速在任意位置进行插入或删除:向 vector 中间位置插入或者删除元素时间复杂度为 O(N),这是因为需要进行数据移动,可能造成较大的性能损失。

  2. 存储空间浪费:vector动态扩展时,需要重新分配连续存储空间,并将原有数据移到新的存储空间中,旧的空间将被释放,造成空间浪费。

  3. 无法存储不同类型的元素:vector中的元素类型必须相同。

  4. 无法自动排序:vector不会对元素进行自动排序。

? ? ? ?vector在随机访问、末尾元素插入、删除、动态扩容方面具有良好的性能,但它的限制也是不可忽视的。在使用vector时应该根据具体的需求,权衡其优缺点,并做出合理的选择。

文章来源:https://blog.csdn.net/m0_62793538/article/details/135110466
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。