如何使用vector来进行一次大批量的push_back?

thelONE328 2005-10-15 04:49:00
我在做一个小项目,碰到一个问题,文件需要分解成多个std::vector<char>在网上传输,不过在把文件分割放入std::vector<char>的过程中对每一个char调用一次push_back,这在大文件传输的时候简直是一个噩梦! 不知道有没有人有好的办法?谢谢了!
...全文
2711 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dev 2005-10-16
  • 打赏
  • 举报
回复
然后调用resize的时候是不是要调用这些对象的默认构造函数?会不会也要影响效率?
=======================================================
对基本类型是没问题。对自定义类型来说,肯定是要调用默认构造函数的。除非你继承重写这个函数。
但是我认为你的自定义类型会那么频繁的调用吗,如果像vector<char>这种情形我还是可以理解,
如果你的自定义类型也这么频繁调用,你不如把缓冲区放入自定义类型,或者你应该考虑是否改一下设计。

^_^
K 2005-10-16
  • 打赏
  • 举报
回复
reserve
codearts 2005-10-16
  • 打赏
  • 举报
回复
>回复人: yingle2000(音乐天堂) ( ) 信誉:100 2005-10-15 23:12:00 得分: 0
>
> 传输大文件的时候只能一块一块传输,一起传输的思路本身就有问题,内存也会被大量消耗。
>一块一块传输用char[]固定长度就可以了,效率最高。

同意



useresu 2005-10-15
  • 打赏
  • 举报
回复
reserve
yingle2000 2005-10-15
  • 打赏
  • 举报
回复
传输大文件的时候只能一块一块传输,一起传输的思路本身就有问题,内存也会被大量消耗。
一块一块传输用char[]固定长度就可以了,效率最高。
thelONE328 2005-10-15
  • 打赏
  • 举报
回复
如果放string就不能放其他的字符了,比如'\0'
——谁告诉你的?
===============================================
在我传递一个二进制文件的时候如果中间有一大段'\0',然后我把这些内容放入到一个string中去的话,接受方应该不能正确的获得这个字符串的长度吧(我没有仔细查过string的实现方式,不过按常识应该是计算开头到第一个'\0'的距离吧)
thelONE328 2005-10-15
  • 打赏
  • 举报
回复
用 resize (),那么vector 对象就知道自己的状态了,copy进去也可以了!
========================================================================
好的,我想这样就太好了。不过如果我的vector里面放了一个自定义的类型,然后调用resize的时候是不是要调用这些对象的默认构造函数?会不会也要影响效率?
fangrk 2005-10-15
  • 打赏
  • 举报
回复
如果放string就不能放其他的字符了,比如'\0'
——谁告诉你的?
step_by_step 2005-10-15
  • 打赏
  • 举报
回复
先调用reverse(),然后再直接把vector<char>当做一维的数组就ok了。
yhbttfile 2005-10-15
  • 打赏
  • 举报
回复
STL有规定string不能放特殊字符吗?
Dev 2005-10-15
  • 打赏
  • 举报
回复
"这种做法没有改变vector对象的状态,vector并不知道自己现在把持了多少对象"

=======================================================

用 resize (),那么vector 对象就知道自己的状态了,copy进去也可以了!

^_^
thelONE328 2005-10-15
  • 打赏
  • 举报
回复
不知道这样行不行,因为要把一个大文件分解为多个小部分,每个部分有固定的大小并用一个vector来承载。可以先做一个vector,然后让它reserve需要的内存空间,在里面填充满字符。然后每次调用它的拷贝构造函数来生成一个新的vector,调用memcpy把需要的内存拷贝到这个vector的内存中去。虽然这个方法还是很莽撞,并且不能保证拷贝构造函数不会慢,不过似乎是有一点希望吧
thelONE328 2005-10-15
  • 打赏
  • 举报
回复
“那就存个结构体,里面放char 数组”
非常感谢~~ 不过这样没有本质上的变化!大家知道vector实际上是一个在物理上连续的内存空间组成的数组, 我觉得比较好的办法是先调用std::vector<T>::reserve()方法来预留一块足够的空间,然后再从vector第一个元素的地址处通过memcpy方法把需要的内存拷贝进去,这样做最大的缺点是这种做法没有改变vector对象的状态,vector并不知道自己现在把持了多少对象,呵呵,真的不知道该怎么办了
oyljerry 2005-10-15
  • 打赏
  • 举报
回复
那就存个结构体
里面放char 数组
thelONE328 2005-10-15
  • 打赏
  • 举报
回复
如果放string就不能放其他的字符了,比如'\0'
力为 2005-10-15
  • 打赏
  • 举报
回复
用string不可以么?

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧