首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
起個名字真難
2018-11-04 17:29
杭州师范大学 算法工程师
关注
已关注
取消关注
关于cpp中的vector的面试问题,请大佬帮忙
各位大佬好,今天面试时候问了我,cpp中vector在数组内存不够时会开辟新内存把原来内存中的数据复制到新内存中,这个复制的过程如何优化。我说了我的想法,就是把内存块像链表一样连接起来,不复制。但是面试官不满意,不知道大佬有什么解决方案呢?
#C++工程师#
提示
全部评论
推荐
最新
楼层
BewareMyPower
中国科学院大学 Java
同意1楼,我也估计是说移动语义,虽然这是C++11标准中已经优化过的东西,C++11也不算什么新东西了。和楼上说的存指针本质上是一样,但是可以直接在vector中优化。 对于vector这种,扩容时肯定要赋值原来的内容,这个开销无法避免。除非你自定义allocator,用内存池,感觉太复杂了,而且这真的有实际作用么? 移动语义对vector的优化在于存放复杂类型,在复制时会调用拷贝构造函数。比如这段代码(copy代表100个元素的拷贝) #include <iostream> #include <vector> using namespace std; struct Object { Object() { p = new int[100]; cout << "ctor" << endl; } ~Object() { if (p) { cout << "dtor" << endl; delete[] p; } } Object(const Object& rhs) { cout << "copy ctor" << endl; p = new int[100]; for (int i = 0; i < 100; i++) p[i] = rhs.p[i]; } int* p; }; int main() { vector<Object> v(2); cout << v.size() << " " << v.capacity() << endl; v.push_back(Object()); return 0; } 运行结果如下 # ./a.out ctor ctor 2 2 ctor copy ctor copy ctor copy ctor dtor dtor dtor dtor dtor dtor 可以发现在容量为2时插入新对象,需要把原来的2个对象拷贝过来,涉及到内部的2*100个int的拷贝,再把新对象的100个int拷贝过来。但这是没必要的,因为旧对象一共300个int全部都拷贝了一份,然后还把原来的给析构了。如果在C++11标准下,给Object加上移动构造函数(move代表1次指针的拷贝) Object(Object&& rhs) noexcept : p(rhs.p) { cout << "move ctor" << endl; rhs.p = nullptr; } 运行结果变成了 # ./a.out ctor ctor 2 2 ctor move ctor move ctor move ctor dtor dtor dtor 可以看到之前多出来的3次copy和dtor变成了3次move,也就是说避免深拷贝,而是仅仅拷贝指针,接管之前的资源。最后把push_back那句改成v.emplace_back(),结果如下 # ./a.out ctor ctor 2 2 ctor move ctor move ctor dtor dtor dtor 继续减少了1次move操作,不用临时构建对象。避免了不必要的复制,原来的数据不进行实际拷贝,只拷贝指向数据的所在地址即可。
点赞
回复
分享
发布于 2018-11-04 19:25
_林泉
大连理工大学 C++
第一,你的想法就是用deque来替代vector,deque就是一块一块的,再连起来。 第二,TMD标准库的东西要是能优化,不早就优化了!还能轮到我们。
点赞
回复
分享
发布于 2018-11-04 18:14
已注销
C++ primer有讲移动构造函数来替代拷贝复制过程,好像涉及到右值引用
点赞
回复
分享
发布于 2018-12-03 21:44
中年失业
朝阳社区学院 C++
C++11以后的话可以使用move语义,避免扩容的时候重新将原有的对象进行深拷贝。
点赞
回复
分享
发布于 2018-12-03 20:22
起個名字真難
楼主
杭州师范大学 算法工程师
**,这么多人回复我的帖子,还有很多我不懂的操作,我要好好看看。
点赞
回复
分享
发布于 2018-11-04 22:57
WOEIJNS
加里敦 Java
对于基本数据类型来说,复制优化?不存在的,或者叫开发内存条的帮你加条专用复制线...... 对于整个类都是基本数据类型,没有额外在堆上分配空间的对象,优化?也是不存在的....... 对于类中有进行堆空间分配的操作的对象,这个就可以优化了,写个移动构造函数,把已经分配的堆空间的所有权转移到新的对象中(记得把原对象的资源指针置空),优化了重新分配堆空间及其内容拷贝的时间,至于原来空间的对象,该析构的析构,没啥优化的.......(大佬们轻喷)
点赞
回复
分享
发布于 2018-11-04 19:51
Logstar
Defiance College (Defiance) C++
嗯大概想了一下,内存不够的时候,重新开辟空间,复制肯定是在所难免的。那就从复制开销上入手,让vector保存指针吧,重新分配的时候,在新的空间里让新的指针接管原来空间指针指向的对象资源。这样原来的就可以不用被析构掉也不用调用构造函数。只是资源转移一下。记得把原指针放空就行了。
点赞
回复
分享
发布于 2018-11-04 18:28
Logstar
Defiance College (Defiance) C++
移动一半太搞笑了吧,这样搞的话你迭代器遍历的时候每次要判断是否到边界。性能的损耗肯定不能接受啊。vector最大的好处就是随机访问,你这不是往随机访问上增加开销么。我觉得指针管理移动的时候std:move吧。看看楼下大佬怎么说。
点赞
回复
分享
发布于 2018-11-04 18:12
快乐的刚子已转码
武汉大学
这个要搞清楚 是用的STL 一级分配器还是二级分配器,如果使用的是一级分配器也就是直接调用malloc,这样的话开销会比较大,可以仿照二级分配器的概念,使用搞一个类似于内存池的东西,预先分配一个比较大的空间,但是这样的话会产生碎片(其实还可以进一步优化),如果是采用的二级分配器也就是内存池,性能的开销也就不在于malloc函数的调用,而是数据从一块空间复制到另一块空间(内存池也不是物理连续的空间,内部也是用链表实现的)。说的可能不对。。。
点赞
回复
分享
发布于 2018-11-04 18:01
不要想着春招再战
广东工业大学 C++
链起来vector就废了,还不如说不会
点赞
回复
分享
发布于 2018-11-04 17:32
暂无评论,快来抢首评~
相关推荐
11-03 07:45
上海交通大学 硬件开发
浙江大华硬件一面
这个面试相比别的面试算是公式化,针对八股进行一些复习可以轻松答出 1.总体上是针对项目进行一些八股的提问 2.zynq的供电 3.摄像头采集的协议与传输的协议 4.dcdc和ldo的区别 5.dcdc选型参数 6.怎么减小纹波 7.项目中的电源树与具体dcdc分布 8.adc选型与工作方式的区别 9.对大华的了解 10.对地点的选择要求 11.反问环节
查看9道真题和解析
点赞
评论
收藏
分享
11-04 10:09
快手_快STAR广告引擎(准入职员工)
光峰科技内推,光峰科技内推码
结构工程师面试经验: 1. 自我介绍 2. 项目介绍 3. 使用的三维软件、仿真软件是什么? 4. 建的模型里几个零部件之间的约束方式 5. 对身边常见的一些产品的内部构件有什么了解? 6. 它们通过什么方式组装/连接? 7. 如果给你个鼠标让你设计,首先要了解什么参数和内容? 8. 对结构工程师岗位的认知 9. 未来的职业规划 10. 工作地点的选择 11. 家庭情况 12. 反问环节光峰科技2026届校园招聘进行中~【招聘岗位】光学 / 硬件 / 算法岗 / 产品研发类 / 技术研发类 / 产品类【我们提供】极具竞争力的薪酬回报机制+产品技术重大创新奖金、专利奖、国际三大工业设计奖等专项激...
点赞
评论
收藏
分享
10-19 18:20
福建师范大学 Java
接了数字马力的offer ,我后悔了…
来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹 是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹 待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹 能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥 内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:
数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞
评论
收藏
分享
10-14 21:06
西北农林科技大学 数据分析师
不是哥们
有点夸张了,50K😥
爱吃烤肠的牛油最喜欢...:
50K是ssp了估计,ssp的人家多厉害都不用说,每年比例大概在百分之5左右
点赞
评论
收藏
分享
11-05 16:58
已编辑
门头沟学院 C++
活久见!知名互联网中厂,竟然做出这种事情!!!
如题,主包在10月13日参加了x米的一面,一周后打电话咨询一面面试官结果,得知一面通过,让我静等二面,直到昨天,还没有收到二面的通知,于是联系在x米内部的同学帮忙问一下hr,结果竟然是流程已中止!我不敢相信,再次发短信给一面面试官,得知结果也是一面通过了,但是不知道为什么流程结束了!所以。。。是不是至少二面kpi一下或者一面直接挂掉呢?无语至极。。。同样的事情今天再次发生,这次的主角是杭州四大xxx之一的ths,主包10.15日一面,当场被面试官加微信,一周后微信咨询得知面试通过,耐心等待二面,经过x米事件之后心有余悸,于是再次主动咨询二面什么时候发起,结果竟然是二面取消了,原因是有一个学生已...
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
招聘动态
查看更多
字节跳动火山引擎
2026校园招聘
联想
2026届校园招聘
字节跳动
2026校园招聘
联想
26届AI专项|内推码NK2026
快手
2026届校园招聘
联想
2026届校园招聘
完美世界
全站热榜
更多
1
...
那个敢跟leader对线的实习生,现在怎样了
3812
2
...
数字马力一面(已挂)
3563
3
...
27找实习,简历求拷打
2398
4
...
字节业务中台后端开发一面
2382
5
...
数字马力 一面
2256
6
...
转测开是我大学生涯做过最正确的选择
2049
7
...
实习才知道原来攒钱这么不容易(给新人小白)
2017
8
...
中兴逼签要接吗?最纠结的一集
1842
9
...
数字马力一面
1824
10
...
云智一面完变筛选中
1757
创作者周榜
更多
正在热议
更多
#
你实习是赚钱了还是亏钱了?
#
29631次浏览
241人参与
#
2022毕业即失业取暖地
#
116064次浏览
705人参与
#
360集团校招
#
21275次浏览
164人参与
#
用一句话形容你的团队氛围
#
18004次浏览
178人参与
#
CVTE求职进展汇总
#
22698次浏览
319人参与
#
你找工作是从容有余 or 匆忙滚爬?
#
11473次浏览
94人参与
#
京东开奖
#
469555次浏览
2672人参与
#
哪些公司校招卡第一学历
#
219859次浏览
776人参与
#
牛客租房专区
#
122466次浏览
1347人参与
#
机械人与华为的爱恨情仇
#
136956次浏览
1012人参与
#
海康威视工作体验
#
45282次浏览
157人参与
#
腾讯音乐求职进展汇总
#
135724次浏览
1005人参与
#
嵌入式岗知多少
#
58370次浏览
548人参与
#
联影医疗求职进展汇总
#
5687次浏览
24人参与
#
毕业论文进行时
#
6372次浏览
80人参与
#
同bg的你秋招战况如何?
#
174190次浏览
1021人参与
#
找实习你看重大厂光环还是业务方向
#
41199次浏览
164人参与
#
58同城求职进展汇总
#
39869次浏览
263人参与
#
我来点评面试官
#
16082次浏览
114人参与
#
面对逼签的应对技巧
#
6657次浏览
34人参与
#
扒一扒那些奇葩实习经历
#
126390次浏览
1100人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务