社区
新手乐园
帖子详情
C++字符串连接速度问题
pcwe2002
2007-09-05 03:35:12
Cstring str1;
for(int i = 1;i!=10000;++i)
{
str1 += "set xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
}
执行速度非常慢,我知道在JAVA或者VB中可以先把值附给数组,然后再用数组的join这样连接字符串会快很多,不知道C++中应该怎么做,请教各位高手
...全文
861
9
打赏
收藏
C++字符串连接速度问题
Cstring str1; for(int i = 1;i!=10000;++i) { str1 += "set xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; } 执行速度非常慢,我知道在JAVA或者VB中可以先把值附给数组,然后再用数组的join这样连接字符串会快很多,不知道C++中应该怎么做,请教各位高手
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
longshanks
2007-09-06
打赏
举报
回复
C++标准是允许以更高的效率处理这样的字符串累加的。因为标准没有要求std::basic_string<>中包含的字符串以连续的方式布置。实际上这完全是为了提高效率。
因此,我们可以在标准的框架下,实现一个高性能累加的标准字符串。比如其内部的字符串存储,可以是通过一个数组或链表,每个数组单元或链表节点指向实际存放子字符串的内存。每次累加一个串,就是在数组或链表中加上一项,并分配一块内存,复制相应的字串。
这种两级构造,便可以使字符串的累加变成O(n)复杂度的操作。效率可以大幅提高。
现在的std::basic_string<>实现基本上没有采用这种方法的。因为这种结构提高了字符串累加的性能,但却使得索引或下标操作不再是O(1)复杂度的了。有利有弊。而标准字符串大多数情况下不会参与如此频繁的累加操作。即使遇到,也可以通过特别的算法进行处理。所以这种实现的价值不大,但副作用不小。
对于特殊要求,某些标准库实现提供了一些扩展的字符串,如SGI的STL库提供的rope(绳索,要比string粗),通过更加复杂的树形结构组织字符串,以满足一些特殊的需求。
MPTD_Fire
2007-09-05
打赏
举报
回复
好像是MFC里的
iambic
2007-09-05
打赏
举报
回复
Cstring是什么?
longbefore2002
2007-09-05
打赏
举报
回复
你也可以定义一个char 类型的数组把值附给数组,最后在把数组附给Cstring
taodm
2007-09-05
打赏
举报
回复
很麻烦的,建议你放弃这个想法。
如果真的担心速度,就用c风格的字符串吧。
pcwe2002
2007-09-05
打赏
举报
回复
具体怎么做能给点代码吗,预先不知道缓存的大小所以不能预先分配。
《Imperfect C++》上怎么说的呢,我没有书,老大指点一下
我啃
2007-09-05
打赏
举报
回复
i!=10000;//可以
预先给于大缓存
否则在appending 过程中不断使得缓存变大,同时使用非常耗时间的拷贝
俄~~
taodm
2007-09-05
打赏
举报
回复
看《Imperfect C++》,上面有快速拼接的解决方案
oo
2007-09-05
打赏
举报
回复
i!=10000 ?
是i<10000
想提高速度,需要提前申请足够的内存,否则 += 时会重新申请内存,再copy
C++
性能优化-
字符串
的优化
字符串
的优化 糟糕的
字符串
连接
函数 在
C++
中
字符串
是按照值的形式实现的,又因为
C++
中
字符串
底层是使用动态内存实现的,因此、在项目中对
字符串
的优化必不可少,也是性能优化的重点。 假如代码中有如下remove_ctrl函数的实现: std::string remove_ctrl(std::string s) { std::string result; for (int i=0; i<s.length(); ++i) { if(s[i] >= 0x20)
高效的C ++
字符串
连接
方法
在Imperfect C ++中,Matthew Wilson提出了一个动态
字符串
连接
器,它预先计算最终
字符串
的长度,以便在
连接
所有部分之前只进行一次分配。表达式越大,
字符串
的副本就越多。如果你想输出大串的图形用户界面,它可能是,无论你是输出到可以处理件
字符串
不是作为一个大的
字符串
更好(例如,在文本编辑器串联文本 - 通常是他们让行作为独立结构)。与.NET System.Strings不同,C ++的std :: strings是可变的,因此可以通过简单的
连接
来构建,就像通过其他方法一样快。
c++
字符串
详解,小白快速入门
以上就是
c++
中
字符串
的基本用法了实践才是检验真理的唯一标准,建议看完后赶紧去编译器上使用一下如果有收获不要忘记点一个免费的赞哦,祝您学习愉快!
c++
性能优化之
字符串
(上)
字符串
很麻烦
c++
不同标准的编译器在std::string 的实现上有区别,未必符合标准
字符串
是动态分配的
字符串
在表达式中,会涉及到复制操作
字符串
的动态分配 C的字符数组是定长的,
c++
字符串
是动态分配的,耗时耗力。
c++
字符串
内部缓冲区大小固定,当某个操作使其长度变长超出缓冲区大小时,会从内存分配一块新的缓冲区,并将
字符串
复制到该缓冲区。 为了避免多次申请缓冲区,std::...
【
C++
】
字符串
拼接及
速度
对比
百万级以上
字符串
拼接建议使用append string str; clock_t c = clock(); //执行100w次 for (int i = 0; i < 1000000; i++) { str = str + "hello";//最慢,基本卡死 } clock_t c2 = clock(); //+= 0.183ms append 0.17ms cout << double(c2 - c) / CLOCKS_PER_SEC << e
新手乐园
33,319
社区成员
41,771
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章