免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 8750 | 回复: 45
打印 上一主题 下一主题

问一个有关于c++ vector的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-18 13:59 |只看该作者 |倒序浏览
想问问,对于vector,如果想向其中添加元素,是不是只能用push_back (insert end)。

感觉push_back的效率对于小的元素来说还可以,如果push的是一个大的元素,那么其间的拷贝的开销有些大。

以前写C的时候,都是直接向数组的最后一个元素的后面一个写入,然后再手动的增加数组大小。这样不需要一个从一个临时元素转到最后的数组中。

不过对与c++的vector,不知道有没有这样的方法,可不可以访问vector最后一个元素后面那个元素(end()),然后再增加vector的size。

网上查了查,没发现可以有这样做的,所以想问问大家对于vector中储存大元素是怎么处理的。

论坛徽章:
0
2 [报告]
发表于 2012-04-18 14:04 |只看该作者
....这都什么乱七八糟的,拷贝文件的效率跟vector扩容的效率有关系吗?

论坛徽章:
0
3 [报告]
发表于 2012-04-18 14:05 |只看该作者
resize什么的然后直接访问。
元素构造开销不能无视的,或者觉得resize分配空间的时机不靠谱的,可以事先reserve。

论坛徽章:
0
4 [报告]
发表于 2012-04-18 16:06 |只看该作者
你往里push_back对象,开销能不大嘛. push_back本身就会产生 replacement new. 更别说resize时的对象复制了.

往里放指针才是王道. 如果非要放对象, 也不是没办法. 用vs2010以上版本的, 使用move constructor

论坛徽章:
0
5 [报告]
发表于 2012-04-18 18:40 |只看该作者
同四楼,存指针,
有个还不错的办法,写一个objectpool,管理足够多的对象,需要用到时去objectpool中申请。

论坛徽章:
0
6 [报告]
发表于 2012-04-19 03:12 |只看该作者
hgrany 发表于 2012-04-18 16:06
你往里push_back对象,开销能不大嘛. push_back本身就会产生 replacement new. 更别说resize时的对象复制了. ...


还是这个问题,如果是存指针,那么对象也要放在一个地方,这样指针才有意义,对象放在那里呢?另开一个数组么?

即便是放在另一个数组,如果这个数组的大小不够,也要realloc,那么之前存放的指针也就没有意义了。

个人感觉vector添加元素的方法还是不够灵活。。。

论坛徽章:
0
7 [报告]
发表于 2012-04-19 03:36 |只看该作者
呵呵,cu终于有人考虑到这个问题了。

动态数据结构少用,这是原则。

对于你这里的知道大小可以resize之后,直接下标访问你的元素。

但是我们自己对Array类有自己的设计,我们的办法简单,一个Alloc接口,直接返回已经管理好的,并length+1。

push_back这些接口就是用来愚弄学生的,但是还在被大行其道的教,乱用错用,导致问题太多了,最后回过头来说c++咋样咋样的不好,低效,未免一叶障目了。

对于一些常见的,看似动态,其实某些层面来说并非动态,比如path这个东西,一般认为不知道该多大。
但是我都是用1k字符数组来放,对99.999%来说,这足够了。非要用个string,然后说我的不对。
我说,对,你说的是对,我的确用得有问题,只是没关系,你用string吧。

论坛徽章:
0
8 [报告]
发表于 2012-04-19 03:41 |只看该作者
回复 5# 家住马戏团


我觉得你说的都不是办法。

只是你说的也是大多数常见的所谓办法。

pool这个东西可以加在很多个层面之间,stl的alloctor就算是一种,还可以直接加在malloc这个层面,就是heapalloc就算一个。
内存一般不要pool,因为malloc等没你想的那么弱,你程序分配5亿次内存,看看一共花多少时间?如果内存都成了效率瓶颈,那程序员真该去死了。但是问题是该不该浪费,比如你这里说的去存个指针什么的,显然不不该去浪费的,因为没那个必要。

对于其他资源,比如文件,比如线程,这些东西加个pool就显得合理,因为创建这些对象太麻烦,中间过程需要太多的计算,况且这些资源一般都比较固定。

论坛徽章:
0
9 [报告]
发表于 2012-04-19 03:47 |只看该作者
总之,如果你非要用vector,并且知道要多大,那直接resize再用,如果你不知道多大,也非要用vector,那你可以按照马戏团说的,存指针。这里还有个问题就是vector的设计是存pod类似的资源,就是存平凡的资源,对于非平凡资源就比较麻烦,存指针也算是一个选择。但是存指针问题来了,你使用起来又不方便,所以还是麻烦。

所以,不要随意去用什么vector这些东西,应该根据自己的需要设计一个数据结构。通用和泛型,这些不过是某些人的意淫,并给你看到了几个特例而已,真正的现实项目中,很少发现。当然,话又说回来,抽象本来就是一个基本能力也是终极能力,把一些常见的功能,常用的数据结构提炼出来,这是应该的,值得这么做。但是不要想到是一了百了,随便都可以用,这就不太好。

前面都当我自己在说,看懂也好,看不懂也好,没关系,我只是记在这里而已。

论坛徽章:
0
10 [报告]
发表于 2012-04-19 03:49 |只看该作者
回复 4# hgrany


move语义还是会有转移构造被调用,这里任然需要拷贝内存。

但是move语义有个好处,就是对一些非平凡资源,比如文件描述符等,那就是好东西了。

move语义在我看来算是11的一个亮点,其实也不过是块补丁。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP