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

STL小结

应用到指针,意思是说它允许子类类型指针转换为父类型指针(这是一个有效隐式转换),同时,也能够执行相反动作:转换父为它子类。... 双端队列deque 基本与向量相同,唯一不同是,其在序列头部插入和删除操作也具有常量时间复杂度 表list 对任意元素访问与对两端距离成正比,但对某个位置插入和删除一个项花费为常数时间...c.push_back(elem); c.pop_back(); c.erase(pos); 删除pos元素,返回下一个元素 c.erase(beg,end); c.resize(num);将元素数量改为...vectorreserve和resize reserve只分配空间,而创建对象,size()不变。...remove从一个容器中remove元素不会改变容器中元素个数,erase是真正删除东西。 13、提防在指针容器使用类似remove算法,在调用类似remove算法前手动删除和废弃指针。

82210

为实习准备数据结构(1)-- 详尽数组篇

组成数组各个变量称为数组分量,也称为数组元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型若干变量按有序形式组织起来一种形式。...char a4[6] = "hello"; // 报错,没有 null 位置 数组大小是固定,不能额外增加元素,当想定义固定大小字符时,使用vector vector vec;...} } 遍历元素 当然,你可以使用数组下标形式访问元素,因为vector重载了 [] 操作,不过建议。...我也不知道为什么有人要就这些区别长篇大论。 begin():指向容器第一个元素地址。 front():指向容器第一个元素值。...vector> //vector相关 #include //容器算法 vector元素不仅仅可以是int,double,string,还可以是结构体,但是要注意:结构体要定义为全局

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

【C++】list迭代器深度剖析及模拟实现(感受封装,和对象思想)

,这就是为什么我们用封装原因。...= end()) { it = erase(it);//更新it,会出现迭代器失效问题。...可能会有人有疑问,为什么我们不能在原来那个里面重载一个返回值为常引用解引用函数呢?...答案是不可以,因为返回值不同无法构成重载函数,所以这两个不同返回值函数不能在同一个里面出现,这也是为什么我们重建了一个,专门搞了一个返回值为常引用解引用函数。...释放当然是正确,因为结点是属于链表,释放结点工作应该交给链表而不是迭代器。 所以当内置类型涉及资源申请时,也并不一定就要写析构函数,还需要视情况而定。

81710

超详细STL之基于源码剖析vector实现原理及注意事项

到这里为止,其实我们还是很疑惑,这个基啥也没干啊,它有什么作用呢,事实,对于形如vector vec;这样声明,vector其实就是调用了这个基无参构造,它就是什么也没干,此时也并没有申请动态内存...2. vector从最后面插入元素时发生了什么 2.1 对空vector插入一个元素 一小节说到,如果vector在构造时候指定容器大小,那么声明时就会申请动态内存,但如果构造是默认构造,并不会申请动态内存...根据以上逻辑,也就是说,对一个无空间vector插入一个元素实际是会先申请1个元素空间,并把这个元素插入到vector。...什么类型不可以作为vector模板类型 对于vector模板特化类型,因为在vector实现过程中,变量会经常被拷贝或者赋值,所以vector模板类型应该具有公有的拷贝构造函数和重载赋值操作符函数...什么情况下vector迭代器会失效 第一是在vector容器中间根据指定迭代器删除元素,也就是调用erase函数,此时因为当前位置会被后面的元素覆盖,所以该指定迭代器会失效,不过此时可以通过erase

2.4K10

一些关于广泛使用C++标准库STL思考

(当然,前边讲拷贝工作方式,以前也是没有去注意到) 分割问题暗示了把一个派生对象插入基对象容器几乎总是错。 那,对于这种拷贝工作方式,有没有什么好对抗办法呢?...当容器一个元素被删时,指向那个元素所有迭代器都失效了。当c.erase(i)返回时,i已经失效。那对于这个循环是个坏消息,因为在erase返回后,i通过for循环++i部分自增。...为了避免这个问题,我们必须保证在调用erase之前就得到了c中下一元素迭代器。...else{ ++i; // 对于好值,只增加i } } 这种调用erase解决方法可以工作,因为表达式 i++ 值是 i 旧值,但作为副作用,i增加了。...事实不是这样!“删除”值完全不必再存在于v中了。 remove并没有改变区间中元素顺序,所以不会把所有“删除元素放在结尾,并安排所有“不删除”值在开头。

45330

STL库基础学习

功能, STL 可以很大程度上减轻你工作量,并且内置异常处理可以让你更清楚看到你所犯下错误。...同样所有支持访问所有元素模板都有自己迭代器。...运算符,利用 (vector 变量 )[index] 可以访问和修改第 index 处元素 添加函数 ◦ void push_back (const T& x): 向量尾部增加一个元素...x ◦ iterator insert(iterator it,const T& x): 向量中迭代器指向元素前增加一个元素 x 删除函数 ◦ iterator erase(iterator...,但是从底层实现上来看,他本质是一个双向链表,不支持随机去访问当中元素,但是在插入,删除元素时间复杂度上远低于 vector 模板 ◦ 常用函数与 vector 当中部分相似或相等,这里逐一介绍

83340

STL容器线程安全性了解多少?

,参数化了所指向对象类型 实例:当你用一个vector结构完成设计时,你总想着泛化容器不同,想着后面是否可以改成deque或者list等东西代替,善意泛化,却造成麻烦 结论:写既要和序列容器又要和关联容器一起工作代码并没有什么意义...,因为很多成员函数只存在其中一容器中,比如,只有序列容器支持 push_front或push_back,只有关联 容器支持 count和lower_bound等等,又如insert或erase在两者表现却不同...list)都有效,完全替代一个容器内容 //为什么区间成员函数优先于它们元素替代品 //区间成员函数是一个像 STL 算法成员函数,使用两个迭代器参数来指定元素一个区间来进行某个操作 //...} //如果避免这种问题:必须保证在调用 erase之前就得到了c中下一个元素得迭代器,因此在 i 使用后置递增 for(std::set::iterator i = caaaa.begin...1,allocator与绑定,因为allocator是一个泛型 2,allocate()申请指定空间,只分配空间,构造对象,返回第一个元素起始地址 3,construct()构造对象,其参数是可变参数

1.3K10

【C++】STL---vector

STL---vector 一、vector 介绍 vector 是表示可变大小数组序列容器。 就像数组一样,vector 也采用连续存储空间来存储元素。...也就是意味着可以采用下标对 vector 元素进行访问,和数组一样高效。但是又不像数组,它大小是可以动态改变,而且它大小会被容器自 动处理。...本质讲,vector 使用动态分配数组来存储它元素。当新元素插入时候,这个数组需要被重新分配大小。为了增加存储空间,其做法是,分配一个新数组,然后将全部元素移到这个数组。...就时间而言,这是一个相对代价高任务,因为每当一个新元素加入到容器时候,vector 并不会每次都重新分配大小。...,所以我们在缺省值中需要给一个匿名对象;如果是内置类型,它会初始化为 nullptr 或 0,我们以前了解到是编译器不会对内置类型进行处理,但是匿名对象会对它进行处理;注意在类型前要加 const 因为匿名对象具有常性

8310

【C++】STL 容器 - vector 动态数组容器 ⑧ ( vector 容器添加 删除元素 | clear 函数 | insert 函数 | erase 函数 )

容器大小 : 0 ; 容器容量 : 3 Press any key to continue . . . 3、删除 vector 容器指定 位置 元素 - erase 函数 iterator 迭代器... erase 函数 删除 指定 索引位置 元素 ; iterator#erase() 函数原型如下 : iterator erase( const_iterator pos ); 该 erase...; 容器容量 : 3 Press any key to continue . . . 4、删除 vector 容器指定 范围 元素 - erase 函数 iterator 迭代器 erase..., const_iterator last ); iterator#erase() 函数 接受两个指向要删除元素常量迭代器作为参数 , 返回一个指向被删除元素范围结束位置之后迭代器 ; 注意 :...(vec); // 删除容器中第一个和第二个元素 // 此处 for 循环条件中, 写 it++ , it++ 只能在特定条件下使用 for (vector::iterator

1.8K10

C++ 中容器详解

1、vector 连续存储结构,每个元素在内存是连续; 支持高效随机访问和在尾端插入/删除操作,但其他位置插入/删除操作效率低下; 2、deque 连续存储结构,即其每个元素在内存也是连续...这样,deque除了具有vector所有功能外,还支持高效首端插入/删除操作。...f、当要存储是大型负责对象时,list要优于vector;当然这时候也可以用vector来存储指向对象指针,同样会取得较高效率,但是指针维护非常容易出错,因此推荐使用。...该函数两个版本返回reverse_iterator或const_reverse_iterator,引用容器第一个元素前面一位 erase 从容器中清除一个或几个元素 clear 清除容器中所有元素...(2) 只能在vector最后进行push和pop,不能在vector头进行push和pop。

77520

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

这样外面的pos确实不是野指针了,但是,这样又不行了: 为什么? 这里是传值返回,返回是拷贝临时变量,具有常性,不能传给引用。 那怎么办?...指定位置元素删除操作–erase 那我们再来实现一下erase: 删除pos位置元素,那我们就直接挪动后面的元素覆盖就行了,如果后一个的话直接- -_finish就行了。...我们试一下: erase删除pos位置元素后,pos位置之后元素会往前搬移,没有导致底层空间改变,理论讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end位置...并且这里肯定都要加const,因为临时变量和匿名对象都具有常性。 那函数内部具体怎么实现呢?...然后只需把每行第一个和最后一个元素初始化为1 ,中间剩余元素是不是就是它一行元素一行前一个元素相加和啊。

17111

开发成长之路(6)-- C++从入门到开发(C++知名库:STL入门·容器(一))

---- STL概述 STL,虽然是一套程序库,但却不仅仅是一套一般印象中程序库,而是一个具有划时代意义、有着深厚理论基础发明。 说是软件组件史上一大突破,也当之无愧。...仿真函数 行为类似函数,从实现来看是一种重载了operator()或模板。 函数指针可视为狭义仿真函数。...} erase() 清除(first,last)中所有元素: 先看图: iterator erase(iterase first,iterase last){ iterator i = copy...() 清除某个位置元素: iterator erase(iterator position){ if(position +1 !...相对于Vector,List还有一个优势,就是不论如何插入和接合操作,都不会造成原有的List迭代器失效。List删除操作也只有指向那个被删除元素迭代器失效,其它迭代器不会受影响。

31710

List超详细解析!(超2w+字)

函数一起使用)merge在相同类型且分别有序情况下,将 list2 中元素都搬移到 list1 中,且按大小进行排序 (list2变成空)sort排序 list 中元素==(效率低,推荐)==...可以明显发现,list 和之前 vector/string 不同,list 是链式结构,在物理空间连续,所以直接对 list 原生指针进行操作,比如++操作,是没办法移到下一个 list 元素位置...而对于 vector/string 迭代器,都是原生指针,实现起来非常简单, 因为他们在物理空间是连续,也支持随机访问。...我们可以将 list 原生指针进行封装,变成一个,再对这个进行运算符重载,就能实现意义迭代器了! 2....vector、string 迭代器怎么适配? 这里在取内嵌类型,只有自定义类型才能在里面搞内嵌类型,内嵌类型也是,typedef也是内嵌类型。如果是一个原生指针呢? 原生指针哪来内嵌类型?

62930

C++:List使用和模拟实现

博主觉得跟之前vector基本差不了多少,如果不会看文档用库里面的list可以去看博主只管关于string和vector使用。...C++:String使用-CSDN博客 C++:Vector使用-CSDN博客 下面直接介绍List使用中易错点 2.1 List迭代器失效问题 我们之前学习vector时候...虽然看似我们好像用箭头连接起来了,但其实他们空间连续,那我们对一个节点指针进行加减,就很难说能不能找到下一个节点,更多是找不到情况 那我们思考一样,如果我们要搞一个迭代器,我们希望怎么去得到我们数据呢...因为typedef碰到const的话,就不是简单字符串替换 实际你以为const T* ,在这里变成了T*const ,因为迭代器我们是希望他可以进行++和--,而我们只是希望他指向内容给改变..._cur; } iterator _cur; }; 思考:为什么解引用是前一个位置元素??? ​

8510

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

上次讲了常用接口:C++初阶:容器(Containers)vector常用接口详解 今天就来进行模拟实现啦 1.基本结构与文件规划 vector.h头文件:包含全部(函数声明与定义) test.cpp...这里假设 T 是一个或者结构体,那么这个语句会调用 T 默认构造函数来创建一个临时对象。 const T& x 表示创建一个类型为 T 常量引用 x。...这里引用是 T 类型引用,而且是常量引用,意味着 x 引用对象是不可修改const T& x = T() 将这个临时对象绑定到常量引用 x 。...迭代器失效可以大致分为两: 结构性变化导致失效:这类失效包括扩容时申请了新空间、插入或删除元素导致元素位置改变等情况。...,erase 函数会返回指向被删除元素之后元素迭代器,而不是原先被删除元素迭代器。

23510

C++:Vector模拟实现

一,前言         在学习string时候,我们可能会发现遍历的话下标访问特别香,比迭代器用舒服,但是下标其实只能是支持连续空间,他使用是非常具有局限性,随着STL学习深入我们会发现其实迭代器才是大佬...思考:为什么迭代器也要搞个模板呢?         答:本质是为了让这个函数更加灵活,可以传不同类型迭代器来帮助我们初始化!!...2.const T&val=T()  T()不是用一次就析构吗,为什么可以用引用 答:T()是一个用一次就析构匿名对象,其实本质是因为他没有名字,用T引用val可以充当他名字,此时用val就相当于用这个匿名对象...思考: 为什么存string就会崩了??   ...2.3.2 erase失效 erase 删除 pos 位置元素后,pos 位置之后元素会往前搬移,没有导致底层空间改变,理论讲迭代器不应该会失效,但是:如果 pos 刚好是最后一个元素,删完之后

7610

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

在实现拷贝构造后,实现赋值重载就比较简单了,利用传值拷贝构造临时对象即可,然后调用swap成员函数即可完成自定义类型赋值工作。为了符合连续赋值含义,我们利用引用来作为返回值。...//1.为什么不用传引用来解决这里问题呢?...erase删除任意位置代码后,linux下迭代器并没有失效,因为空间还是原来空间,后序元素往前搬移了,it位置还是有效,但是在vs下就会直接报错,所以对于erase之后迭代器是否失效这一讨论,为了保证程序良好移植性...这就是if和if else在用法区别。 平常在使用时,要根据具体场景恰当选择这两个分支语句中哪一个,之前我不知道两者区别的时候,就因为使用场景恰当,导致出现了很多bug。...解引用比较麻烦 } size_t size()const//const和非const对象都能调 { return _finish - _start; //左闭右开差正好就是这个区间内元素个数,[

53630

从零开始学C++之标准库类型(二):vector 简介和例程

一、标准库vector类型 vector是同一种类型对象集合 vector数据结构很像数组,能非常高效和方便地访问单个元素 vector是一个模板(class template)  vector... using std::vectorvector对象初始化: vector定义了好几种构造函数 vector  v1;  //vector保存类型为T对象...默认构造函数v1为空 vector v2(v1);// v2是v1一个副本  vector v3(n, i); //v3包含n个值为i元素  vector v4(n); //...void resize(size_type n, const T& c = T()); (1)如果n大于容器当前大小(即size()),则在容器末尾插入n-size()个初值为c元素,如果指定初值...= v.end(); /*++it*/)     {         if (*it == 3)         {             it = v.erase(it);   // erase返回是当前删除元素下一个元素

71800

C++知识概要

为什么 C++空大小不为 0,不同编译器设置不一样,vs 设置为 1 C++标准指出,不允许一个对象(当然包括对象)大小为 0,不同对象不能具有相同地址 带有虚函数 C++大小不为...key,就将一个具有该 key 和 value 默认值插入这个 map erase()函数,只能删除内容,不能改变容量大小; erase 成员函数,它删除了 itVect 迭代器指向元素,并且返回要被删除...为什么是 1.5 倍 vector 通过一个连续数组存放元素,如果集合已满,在新增数据时候,就要分配一块更大内存,将原来数据复制过来,释放之前内存,再插入新增元素 初始时刻 vector...,所以最好倍增长因子设置为(1,2)之间 向量容器 vector 成员函数 pop_back()可以删除最后一个元素 而函数 erase()可以删除由一个 iterator 指出元素,也可以删除一个指定范围元素...平台原因(移植原因) 不是所有的硬件平台都能访问任意地址任意数据; 某些硬件平台只能在某些地址处取某些特定类型数据,否则抛出硬件异常 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界对齐

1.1K20
领券