首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c++】vector以及vector的模拟实现

因此删除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实例化的时候需要类型,所以在命名空间中用类模板进行实现

6810

C++】模拟实现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

6120
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    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; } 总结 以上就是今天要讲的内容,本文介绍了作者自己实现

    31840

    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

    8810

    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 里面。

    46700

    C++ vector顺序表模拟实现

    目录 前言: 模拟实现: 构造函数: 析构函数: 容量调整(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函数也就是容量调整函数后面实现

    7310

    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++ 中。

    35810

    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中需要实现

    24450

    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

    55630

    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

    9010
    领券