首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

C++之模拟实现vector

前言 因为学习了vector的相关知识,了解了vector大部分接口的底层实现原理,所以我决定自己模拟实现一个mini版的vector类,用来加深对vector各方面知识的理解。...= last) { push_back(*first); first++; } } 2.拷贝构造 现代写法的优点在模拟实现string中已经介绍过,此处不再赘述。...(nullptr) { vector temp(v.begin(), v.end()); Swap(temp); } 自己实现的Swap可以避免深拷贝,提高效率 void...再次使用时要进行更新它(erase函数的返回值就是更新后的it迭代器,此时它指向刚刚被删除元素的下一个元素) //虽然部分编译器(linux的g++下不报错)中erase后的迭代器还能继续使用,但不能保证所有编译器下它都不报错...cout << vv[i][j] << " "; } cout << endl; } cout << endl; } 总结 以上就是今天要讲的内容,本文介绍了作者自己实现

28440

C++:Vector的模拟实现

Vector虽然也支持下标访问,但是很多成员函数都是用的迭代器,所以我们要模拟实现的话迭代器十分重要,vs使用的是PJ版的STL版本,比较难懂,所以我们模拟实现统一用SGI版本去实现,所以在模拟实现之前...通过这个我们可以观察到SGI版本下的迭代器其实就是一个原生指针,value_type*类型相当于是模板T对应的指针类型,有了这些大致了解,我们就可以去模拟实现啦!!...二,vector的模拟实现 大致框架需要有模板(类外定义)/迭代器以及迭代器的获取(public定义,要有可读可写的也要有可读不可写的)/成员变量(private定义)  并且为了不和库的vector...= last) { push_back(*first); ++first; } }  push_back是尾插数据,具体实现后面会写。...nullptr; } 注意:delete空指针是没关系的,delete会自己判断     delete出问题一般都是野指针 2.1.7 构造函数相关的全部代码  我们发现大部分都设计要到初始化为nullptr,c11

6410

C++】STL 模拟实现vector

文章目录 一、vector 的使用 1、构造函数 2、扩容机制 3、三种遍历方式 4、容量操作 5、元素访问 6、修改 -- 迭代器失效 二、vector 的模拟实现 1、浅析 vector 源码...2、扩容机制 vector 的扩容机制和 string 的扩容机制是一样的,因为它们都是动态增长的数组:VS 下大概是 1.5 被扩容,Linux g++ 下是标准的二倍扩容,测试用例如下: void...,况且其中很多 C++ 的语法我们也还没学。...当前阶段,我们阅读 STL 源码是为了学习 STL 库的核心框架,然后根据这个框架自己模拟实现一个简易的 vector (只实现核心接口);阅读源码与模拟实现能够让我们更好的了解底层,对 STL 做到...仅仅是将几个头文件包含在一起,vector 的主要实现都在 stl_vector.h 里面。

45000

C++初阶:适合新手的手撕vector(模拟实现vector

上次讲了常用的接口:C++初阶:容器(Containers)vector常用接口详解 今天就来进行模拟实现啦 1.基本结构与文件规划 vector.h头文件:包含类的全部(函数的声明与定义) test.cpp...在这个实现中,_finish 指针始终指向当前元素范围的末尾,也就是下一个要插入元素的位置。 _endOfStorage:指向动态数组分配的内存空间的末尾之后的位置的指针。...在这个实现中,_endOfStorage 指针指向当前分配的内存空间的末尾,当需要扩充容量时,会通过比较 _finish 和 _endOfStorage 的位置来判断是否需要重新分配更大的内存空间 2....capacity 函数: capacity 函数用于返回数组的容量,即 _endOfStorage 和 _start 之间的距离 怎么来理解:const T& x = T() 实现给出各种类型的默认值,...在这里为了妥协,其实内置类型也有构造函数在 C++ 中。

17110

C++STL-vector实现 空间配置器

class vector { private: T *_first; T *_last; T *_end; public: vector(int size=10) { _first...2.pop_back推出vector尾部的元素时,没有进行析构,如果此时vector的元素为对象并且持有堆资源,那么就会造成内存的泄露?...空间的释放时机是vector对象生命周期结束时 造成上述结果的缘由: 1.vector的构造函数直接使用了new,包含两个动作,开辟空间和调用构造函数进行构造。...内存开辟和释放,对象构造和析构完全分离开来,至此,简易的vector已经实现了。 三、增加带右值引用的push_back,进一步提高效率,旨在优化构造对象的背后调用函数的开销。...template void construct(T *p, Ty &&x) { new (p) T(std::forward(x)); } 需要注意的是模板类Test中需要实现

22250

C++】vector的模拟实现(SGI版本)

并且对于vector来说,由于它的底层是由顺序表实现的,所以它的迭代器就是原生态指针T*,我们定义了const和非const的迭代器,便于const和非const对象的迭代器的调用。...下面是SGI版本的stl_vector.h的源码实现,我们模拟实现的就是SGI版本的源码。...这里的迭代器需要用函数模板来实现,因为构造vector所用的迭代器不一定只是vector类型的,还有可能是string类型,所以这里的迭代器形参需用模板来实现。...erase删除任意位置代码后,linux下迭代器并没有失效,因为空间还是原来的空间,后序元素往前搬移了,it的位置还是有效的,但是在vs下就会直接报错,所以对于erase之后迭代器是否失效的这一讨论,为了保证程序良好的移植性...{ if (n > capacity())//只进行扩容 { size_t oldsize = size(); T* tmp = new T[n];//不需要检查new失败,因为C++new

52430

c++】vector模拟实现与深度剖析

vector涉及到许多细节问题,比如双层深拷贝,迭代器失效等,本篇文章我们通过模拟实现来深度理解这块的内容 目录 `1.基本框架` `2.构造和销毁` `3.元素访问` `4.获取迭代器与容量操作...这不是最后一个有效元素的位置,而是整个内存块的结束位置,在这之后可能会有额外的未初始化空间,预留以实现vector增长时无需重新分配整个数组 2.构造和销毁 vector() 空值初始化: vector...(size_t n, const T& value = T()) 这个函数的功能是用n个value元素来构造一个vector 实现如下: vector(size_t n, const T& val =...,因此编译器就会将InputIterator实例化为int但是10和5根本不是一个区间,编译时就报错了故需要增加该构造方法 vector(const vector& v) 拷贝构造函数实现,只需要分配好空间对元素依次尾插即可...reserve和push_back函数的模拟实现,我们后文会讲到 ~vector() 对于析构函数,我们需要释放空间并置指针指向空: ~vector() { delete[] _start; _start

6910

C++ STD::VECTOR的RESIZE和RESERVE看VECTOR的源码实现

/vector/reserve/ 第一步:搞清楚vector数据结构定义 思考60秒:sizeof(vector)大小多少?...可分配空间是vector之外的 思考60秒:vector(10,0) 执行过程 vector(10,0) 执行过程 a 执行_Vector_base构造函数 b 初始化size(10),调用对应构造函数..._M_finish =_M_end_of_storage=10; c:容器的容量(capacity)和大小(size)大小一样了 v1.size() == 15 v.capacity() = 15 申请空间...字节空间 malloc _Tp* _M_allocate(size_t __n) { return _M_data_allocator::allocate(__n); } //释放:具体怎么实现的不清楚...::reserve Request a change in capacity 第二步 查看 insert函实现 case1-a:对应的源代码解析中的case1-a情况; case1-b:对应源码剖析中的

1K10

vector不是模板_vector实现

1.vector容器 vetcor顾名思义就是一个向量的容器,该容器中的每个元素都属于同一个类型,有点类似于数组,vetor容器与数组的不同之处就在于,它具有“动态”的属性,举例来说,如果定义了一个vector...vector容器的常规操作有: 初始化 vectora(10) vector :说明这是一个什么容器 int : 说明这个容器里面放的是什么类型的东西 a: 容器名 (10); 这个容器有多大...vectora(10,995) //这个容器一共有10元素,每个元素的值都是998 访问vector 下标 at方法 其他 a[10] //访问第11个元素 a.at(4) //访问第...5个元素 a.back(); //返回a的最后一个元素 a.front(); //返回a的第一个元素 遍历vector中的元素 迭代器 for(auto it = a.begin(); it !...利用下标 for(auto i = 0; i < a.size(); ++i) cout<<a[i]<<" "; cout<<endl; 注意 .size()方法可以获取vector

60910

C++】STL——vector 深度剖析 及 模拟实现

2. vector的模拟实现 那接下来,我们就对vector进行一个模拟实现。...删除vector中任意位置上元素时,vs就认为该位置迭代器失效了 注意⚠:Linux下,g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端。...2.5 剩余接口补充 2.5.1 析构 接下来我们来实现一下析构: vector涉及资源申请,析构函数是需要我们自己实现的: 2.5.2 其它版本的构造 构造函数其实我们一开始就实现了,不过我们只实现了一个默认构造...但是,如果我们用C语言去写这道题: 大家看,其实是有点麻烦的,一级指针、二级指针,最终返回的数组还得是malloc的。首先这个参数可能就给我们看懵逼了。 而C++呢?...C++有了vector,就爽很多了。

14010
领券