因此删除vector中任意位置上元素时,vs就认为该位置迭代器失效了 注意:Linux下,g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端 从上述三个例子中可以看到:SGI STL中,...,vector的容量为: " << v.capacity() << endl; // 经过上述reserve之后,it迭代器肯定会失效,在vs下程序就直接崩溃了,但是linux下不会 // 虽然可能运行...的容量为: 5 扩容之后,vector的容量为 : 100 0 2 3 4 5 409 1 2 3 4 5 // 2. erase删除任意位置代码后,linux下迭代器并没有失效 // 因为空间还是原来的空间...深度剖析及模拟实现 3.1 使用memcpy拷贝问题 假设模拟实现的vector中的reserve接口中,使用memcpy进行的拷贝,以下代码会发生什么问题?...类型的,每行没有包含任何元素,如果n为5时如下所示: vv中元素填充完成之后,如下图所示: 使用标准库中vector构建动态二维数组时与上 3.3 代码实现 由于vector实例化的时候需要类型,所以在命名空间中用类模板进行实现
一.了解项目功能 声明: 该模拟实现仅适用于STL初学小白了解vector的简单实现,会结合一些STL源码作为参照,但是源码中涉及的空间配置器部分我们不做涉及!...在上篇博客中我们详细介绍了C++标准库vector对象集合,包含它的常用成员函数及其使用示例: 【C++】标准库类型vector https://blog.csdn.net/weixin_72357342...,我们需要将vector实现为一个类模板,这样才可以满足上面的需求,有关C++泛型编程模板相关知识还不是很了解的朋友可以先移步: 【C++】初阶模板 https://blog.csdn.net/weixin...spm=1001.2014.3001.5502 二.逐步实现项目功能模块及其逻辑详解 通过第一部分对项目功能的介绍,我们已经对vector的功能有了大致的了解,虽然看似需要实现的功能很多...& operator=(vector v) { swap(v); return *this; } 实现vector的begin()函数和end()函数 因为我们实现的vector
> vector(InputIterator first, InputIterator last); ~vector(); vector& operator=(vector v);...模拟实现 vector成员变量 vector成员变量,和顺序表的成员变量有所不同,不再是指针、size和capacity了,而是迭代器 start、finish和end_of_storage。...(这个需要先实现交换函数) vector& operator=(vector v) { swap(v); return *this; } 注意事项: 在赋值的过程中没有使用...iterator 迭代器 vector 的迭代器这里实现的是原生指针;迭代器相关函数:begin()、end()这些都比较简单就不过多描述了。...模拟实现就结束了,希望你能有所收获 感谢各位大佬支持并指出问题 如果本篇内容对你有帮助,可以一键三连支持以下,感谢支持!!!
前言 在之前已经介绍了vector【C++】vector介绍,这次来看看它的模拟实现。...initializer_list里面就包了迭代器: 所以模拟实现出来就是: vector(initializer_list il) { reserve(il.size...这里可能会是string也可能是vector,所以这里用一个无参匿名对象const T& val = T()。 内置类型没有初始化,但是C++出现模板之后,被迫给内置类型也有构造和析构。...输出 想要实现不同类型的vector打印输出,就直接定义一个类模板template然后再写打印函数输出的时候把T代入: void print_vector(const vector<T...(v2); 这样不同类型的vector就都可以实现输出: 7.
成员变量与迭代器 我们还是需要在一个命名空间里模拟实现vector,防止和标准库里的起冲突。...2.vector可以看做顺序表的升级,但是模拟实现vector跟我们以往实现顺序表有所不同,顺序表是使用一个动态开辟的数组、数组有效元素个数size和数组容纳最大有效数据的个数capacity维护的,而模拟实现...这里时候可以自己写无参构造,也可以用default强制编译器生成(C++11的用法)。...//构造 /*vector() {}*/ //c++11 强制生成构造 vector() = default; 迭代器区间构造 //类模板的成员函数,还可以继续是函数模版 template<class...int a = int(); int b = int(2); int c(3); cout << a << endl; cout << b << endl; cout c << endl; 析构函数
delete=free+destructorp->~T();}};templateclass vector {public:vector() : begin_(nullptr),...= vec.end_; ++p, ++cur) {alloc->construct(cur, *p);}}vector(vector&& vec) {cout construct(cur, *p);}return *this;}vector& operator=(vector&& vec) {cout... vec1;vector vec2(2);vector vec3(vec2);vec2.push_back(1);vec2.push_back(2);cout vector vec5 = std::move(vec3);vector vec6 = {1, 2, 3};cout <<
前言 接:C++ —— 关于vector-CSDN博客 https://blog.csdn.net/hedhjd/article/details/142334349?...套一层模板,让它被谁都可以使用 template void print_vector(const vector& v) { //如果typename在没有实例化的类模板里面取东西...拷贝构造 4.1 构造与析构 //默认构造 vector() {} // C++11 强制生成默认构造 //vector() = default; //析构...} } 4.2 拷贝构造 //拷贝构造 vector(const vector& v) { reserve(v.size()); for (auto& e : v)..._end_of_storage); } // v1 = v3 vector& operator=(vector v) { swap(v); return *this; } 4.4 迭代器区间
无参默认构造 vector() :_start(nullptr) , _finish(nullptr) , _endofstorage(nullptr) {} 2. size size_t size...析构函数 ~vector() { if (_start) { delete[] _start; _start = _finish = _endofstorage = nullptr; }...(const vector& v) { reserve(v.capacity()); for (auto& e : v) { push_back(e); } } 16.赋值重载 //交换...void swap(vector& tmp) { std::swap(_start,tmp...._endofstorage); } //赋值重载 //v1 = v3; vector& operator=(vector v)//传值传参会调用拷贝构造,v3拷贝给v { swap(v);
typedef const T* const_iterator; //默认构造 vector() {} //拷贝构造 vector(const vector& v) {...//vector& operator=(const vector& v) //{} //现代写法 vector& operator=(vector tmp)...(const vector& v) {} } 2、vector的模拟实现 2.1 构造和析构 虽然vector使用编译器生成的默认构造就行,但是我们还需要写拷贝构造,有了构造函数编译器就不会生成默认构造了...模拟实现完整代码 vector.h: #pragma once #include #include #include using namespace...::test_vector4(); //yjz::test_vector5(); //yjz::test_vector6(); yjz::test_vector7(); return 0; }
前言: 继上文模拟实现了string之后,接着就模拟实现vector,因为有了使用string的基础之后,vector的使用就易如反掌了,所以这里直接就模拟实现了,那么实现之前,我们先看一下源代码和文档...: 源码不多看,因为很容易绕晕进去,我们从这两个部分得到的信息就够了,首先,vector是一个类模板,即我们可以往里存放许多不同的数据,比如实现一个二维数组,我们可以用vector里面套一个vector...,但是实际上vs下的vector扩容的时候是使用的1.5倍扩容,我们模拟实现的是linux下的vector,在string模拟实现的时候,我们拷贝数据使用的是strcpy,在这里因为是模板,所以不能使用字符串函数...这是一个类,它的成员变量也就几个迭代器和size,但是这是c++11引进的,即c++11准许如下的初始化方式: void Test_vector() { //有关initializer_list...int a = 1; int b = { 1 }; int c{ 1 }; //上面写法均正确 但是不推荐后面两种 vector v1 = { 1,2,3,4,5,6 };//隐式类型转化
前言 因为学习了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; } 总结 以上就是今天要讲的内容,本文介绍了作者自己实现的
1.查看STL源码 start、finish、end_of_storage 都是指针 ---- 通过观察函数的实现过程,可以得知 start与begin等价 ,end与finish等价 2.vector...的模拟实现 为了模拟实现vector,所以使用自己的名空间包含vector类 ---- 1....环境测试 VS做了强制检查,只要使用了erase,迭代器就失效了,所以会报错 ---- 而同样的代码在Linux下会就能正常运行 遇到偶数就删除,并且每次结尾pos都会++,运行结束时正好pos...整体代码实现 #include #includevector> #include #include #include<functional..._end_of_storage); } // v1 = v2 vector& operator=(vector v)//自己实现赋值运算符
C++ string string 的C++代码实现 class string{ //构造函数 string(char* data) { if(m_data == null || strlen(...; m_data = new char[len+1]; strcpy(m_data, others.m_data); return *this; } char* m_data; } 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
目录 前言: 模拟实现: 构造函数: 析构函数: 容量调整(reserve): resize函数: 尾插(push_back): 尾删(pop_back): 插入(insert): 销毁(erase...): []重载: 交换(swap): =重载: 代码 前言: 在学习vector的功能后,我自己模拟实现了一些vector的基本功能,这篇文章用来分享一下,也便于我后续的复习。...模拟实现: 总所周知vector中迭代器是遍历vector的重要工具,既然我这里只是简单的模拟,那迭代器就用简单的指针来模拟,先typedef一下: vector可以装很多类型,int,char,float...endofstorage指向vector容量的最后一个 给缺省值都为空指针: 然后再来几个简单,但又很重要的函数: 构造函数: 我这里只实现3种常用的构造函数: 1.vector v...这里的push_back函数也就是尾插函数后面会实现,这里先复用。 2.vector v1(v2): 这个也就是拷贝构造函数: 同样这里的reserve函数也就是容量调整函数后面实现。
前言 之前我们学习了vector的常用接口及其使用方法: 【c++丨STL】vector的使用-CSDN博客 本篇文章,我们将深入探讨vector的底层实现原理,并尝试模拟实现其结构以及一些常用接口...一、vector底层刨析 之前已经提到,vector的底层是动态顺序表,我们使用c语言实现顺序表的结构时赋予了它三个成员变量: typedef int SLDataType; //动态顺序表...另外,由于vector本质上是一个类模板,允许我们存储任意类型的数据元素,因此在接下来模拟实现vector的过程中,我们也将采用类模板来进行定义。...因此,建议先阅读string模拟实现之后,再来阅读本文,否则其中的一些实现过程可能会较难理解。 2. 功能实现 接下来,我们将正式开始实现上述接口的功能。...代码实现: //交换 void swap(Vector& tmp) { std::swap(_start, tmp._start); std::swap(_finish, tmp.
上次讲了常用的接口:C++初阶:容器(Containers)vector常用接口详解 今天就来进行模拟实现啦 1.基本结构与文件规划 vector.h头文件:包含类的全部(函数的声明与定义) test.cpp...在这个实现中,_finish 指针始终指向当前元素范围的末尾,也就是下一个要插入元素的位置。 _endOfStorage:指向动态数组分配的内存空间的末尾之后的位置的指针。...在这个实现中,_endOfStorage 指针指向当前分配的内存空间的末尾,当需要扩充容量时,会通过比较 _finish 和 _endOfStorage 的位置来判断是否需要重新分配更大的内存空间 2....capacity 函数: capacity 函数用于返回数组的容量,即 _endOfStorage 和 _start 之间的距离 怎么来理解:const T& x = T() 实现给出各种类型的默认值,...在这里为了妥协,其实内置类型也有构造函数在 C++ 中。
1、定义vectorvector> A;//错误的定义方式vectorvector > A;//正缺的定义方式2、插入元素若想定义A = [[0,1,2],[3,4,5]],则:...//正确的插入方式vectorvector > A;//A.push_back里必须是vectorvector B;B.push_back(0);B.push_back(1);B.push_back...(2);A.push_back(B);B.clear();B.push_back(3);B.push_back(4);B.push_back(5);A.push_back(B);//错误的插入方式vector...(4);A[1].push_back(5);3、长度//vectorvector >A中的vector元素的个数len = A.size();//vectorvector >A中第...i个vector元素的长度len = A[i].size();4、访问某元素访问某元素时,方法和二维数组相同,例如://根据前面的插入,可知输出5。
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中需要实现
并且对于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
领取专属 10元无门槛券
手把手带您无忧上云