vector:底层存储是一个数组,可变大小的数组,支持随机访问(O(1)),在尾部之外的位置插入和删除操作时间复杂度是 O(N); deque:双端队列,支持随机访问(O(1)),在头部和尾部之外的位置插入和删除的时间复杂度是O(N); list:双向链表,不支持随机访问,只支持顺序访问,在任意位置的插入和删除速度很快; forward_list:...
访问元素,时间复杂度为O(1); 在末尾插入或者删除元素,时间复杂度也为O(1); 在中间插入或者删除元素,时间复杂度为O(n) vector注意事项 1. 在不确定的情况下使用at而不是operator[] 在前面访问元素小节那里我们说了,at会检查是否越界,假设不确定当前访问动作是否会越界,那么我们应该使用at函数。 2. 什么类型不...
存取:vector能够进行高效的随机存取操作,时间复杂度为O(1);list是通过指针访问数据,不能进行随机访问,时间复杂度是O(n)。 插入/删除:vector因地址时连续的,进行插入和删除操作时会进行内存块的拷贝复制,时间复杂度是O(n);list是非连续的存储结构可以进行快速的插入和删除操作。 存储结构:vector是连续的存储结构,...
复制 #include<vector>#include<iostream>intmain(){std::vector<int>vec;// 添加元素以改变容量和大小vec.push_back(1);vec.push_back(2);std::cout<<"Size: "<<vec.size()<<", Capacity: "<<vec.capacity()<<std::endl;// reserve更多容量vec.reserve(10);std::cout<<"Reserved capacity: "<<...
访问时间复杂度:O(1) 插入:在最后插入(空间够):很快 在最后插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝。 在中间插入(空间够):内存拷贝 在中间插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝。 删除:在最后删除:很快 在中间删除:内存拷贝 适用场景:经常随机访问,且不经常对非尾节点...
3、vector对尾部操作很方便,对头部或者插入都需要O(n)的时间复杂度; 采用模板实现泛型类vector,为了支持大多数的编译器,将实现文件全部放在头文件中,不采用分离编译的方式。 说明: 1、只实现了部分函数的功能,但是类似的可以定义其他的函数; 2、迭代器只是采用定义为指针的方式,这种方式比较简单,但是不能实现迭代器...
数组支持随机访问,根据下标随机访问的时间复杂度是O(1)。 为什么数组编号从0开始 从数组的内存模型来看,“下标”最确切的定义实际上应该是“偏移(offset)”。a[k] 就表示偏移 k 个 type_size 的位置。 从0开始时,计算a(k)的寻址公式: a[k]_address = base_address + k * type_size ...
1. 2. 3. 4. 5. 6. 7. vector 容器:构造函数和 size vector 可以在构造时指定初始长度。 explicit vector(size_t n); 例如,要创建一个长度为 4 的 int 型数组: vector<int> a(4); 1. 之后可以通过 a.size() 获得数组的长度。 size_t size() const noexcept; eg:my_course/course/13/01_ve...
前言:vector容器是 STL 中最常用的容器之一,记录一些常用操作与方法,谨防遗忘!1、vector特性:擅长在尾部插入或删除元素,在常量时间内就可以完成,时间复杂度为O(1);在容器头部或者中部插入或删除元素,则花费时间要长一些(移动元素需要耗费时间),时间复杂度为线性阶O(n)2、创建vector(1)创建空的vector容器: ...
它们的访问复杂度和随机插入/删除复杂度都是O(1)。但是因为重新分配内存并复制,向量在扩展时成本更高,而双端队列则没有这个问题。 看起来双端队列性能更好,但为什么大多数人还是使用向量而不是双端队列呢? - SwiftMango2 当访问项目时,vector 更有效率。O(1) 复杂度并不意味着两者使用相同数量的周期。此外,...