首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
暂无评论,快来抢首评~
相关推荐
07-28 13:25
门头沟学院 客户端其它
扪心自问,你配ssp吗
ssp级别的offer仅占5%,你问问你自己,你学历、竞赛经历、项目经历、实习经历,你都做到极致了吗。来来来,咱算算,你要拿到ssp的offer,你的脚下要踩着多少人。首先要先拿到白菜级别的offer,这关录取率取平均值仅为2%,sp级别的offer占白菜级别的60%-80%,ssp级别占sp级别的5%。2%*80%*5% = 0.08%,也就是说,一个ssp级别的offer是1250人在竞争,2024年国考录取率是1.75%,这TMD比国考都难,能拿到ssp级别的大佬,堪比大熊猫。人贵在认清现实,但这并不是最重要的,最重要的是,你在看清现实之后,依旧拥有一颗不放弃、赤诚火热的心!!!你理想的...
职场不咸鱼:
人有多大胆,地有多大产!选50w的牛油请点赞我
什么样的背景能拿SSP?
点赞
评论
收藏
分享
07-30 11:25
已编辑
门头沟学院 Java
今年秋招开得也太快了吧🫠
这才七月底,就有一堆公司开启了提前批,这让我这种还在实习的小趴菜怎么办,完全不敢投要简历没简历,要八股没八股,每天起床就是跟 dirty work 对线,工作了一整天,回到宿舍累得一批,都学不动了我想的是这半个月好好整理实习的东西,等到八月中旬再开投,不知道还来不来得及,大家怎么看呢
想养修勾的王者在人才...:
提前批是6月就开了吧,现在是有些正式秋招开了
26届的你,投了哪些公司...
点赞
评论
收藏
分享
07-13 10:24
广州南方学院 运营
求给建议,真没招了,一个进面的都没有
来个厂收我吧:
首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞
评论
收藏
分享
07-26 00:18
滴滴_测试开发工程师
说这话前没想到结局会这么好笑...
《咋开上网约车了》
嗨害嗨我来了:
你跟他说开迈巴赫呢,一个月好几万,让学弟尝尝一点小小的社会险恶
点赞
评论
收藏
分享
07-31 14:12
门头沟学院 Java
究竟是什么样的工作能给hr逼成这样
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
招聘动态
查看更多
米哈游2026校园招聘
瓴岳科技
2026届“登岳计划”校招启动
滴滴
2026届秋季校招提前批
京东
JDS-新星计划
全站热榜
更多
1
...
百度提前批,三面被推迟一周,喜提秋招第一凉
9779
2
...
虾皮秋招一面
3324
3
...
他拿大厂SSP Offer打牌是什么概念啊?25届双非之光
3321
4
...
觉得研发高人一等的这辈子有了
2159
5
...
百度提前批 三面
1963
6
...
最强本科✌
1668
7
...
被猿辅导挂了简历,但我想说...
1419
8
...
也是逆天了
1369
9
...
虾皮一面凉经
1299
10
...
上班一周,工资还没拿,先欠公司两千
1263
创作者周榜
更多
正在热议
更多
#
工作中哪个瞬间让你想离职
#
64929次浏览
577人参与
#
找工作如何保持松弛感?
#
92055次浏览
1112人参与
#
中兴秋招
#
206633次浏览
2302人参与
#
如何快速融入团队?
#
18045次浏览
214人参与
#
秋招被确诊为……
#
165444次浏览
774人参与
#
和同事相处最忌讳的是__
#
25746次浏览
250人参与
#
投格力的你,拿到offer了吗?
#
87267次浏览
585人参与
#
虾皮求职进展汇总
#
250196次浏览
1875人参与
#
计算机专业还有必要去大厂卷吗
#
38641次浏览
183人参与
#
你最希望上岸的公司是?
#
135647次浏览
709人参与
#
26届的你,投了哪些公司?
#
48513次浏览
510人参与
#
Offer比较,你最看重什么?
#
194066次浏览
1315人参与
#
简历上的经历如何包装
#
31230次浏览
846人参与
#
我对___祛魅了
#
50888次浏览
458人参与
#
柠檬微趣工作体验
#
6841次浏览
40人参与
#
你遇到最难的面试题目是_
#
17229次浏览
205人参与
#
你跟室友的关系怎么样?
#
7828次浏览
121人参与
#
通信硬件岗投递时间线
#
18887次浏览
69人参与
#
我想象的实习vs现实的实习
#
290465次浏览
2246人参与
#
什么样的背景能拿SSP?
#
40540次浏览
233人参与
#
你最讨厌面试问你什么?
#
29417次浏览
322人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务