std::string多个插入字符方式以及效率对比
2023-12-25 21:12:03
????????往string字符串里插入单个字符时,有多种实现方式,+=、append()、push_back(),这些方式适用于不同的插入场景。
适用的插入场景
1、各方式支持的类型如下
Append | += | push_back | |
整个字符串 | Ok | Ok | No |
字符串子串 | Ok | No | No |
字符数组 | Ok | Ok | No |
单个字符 | Ok | Ok | Ok |
迭代器 | Ok | No | No |
C string | Ok | Ok | No |
1.1 完整字符串方式
+=:OK; append:OK
//full-string
void fullStringAppend(string str1, string str2)
{
string str;
//append
str.append(str1);
//+=
str += str2;
return;
}
1.2?字符串子串
append:ok
//part-string
void partStringAppend(string str1)
{
string str;
str.append(str1, 0, 3);
return;
}
1.3 字符数组
append:ok +=:ok
//character-array
void CharArrayAppend(string str1, string str2)
{
char ch[10] = {'h', 'e', 'l', 'l', 'o', '\0'};
str1.append(ch);
str2 += ch;
return;
}
1.4 单个字符
append:ok +=:ok push_back:ok
//signal-character
void signalAppend(string str1, string str2, string str3)
{
str1.append("c"); //append方式不支持字符,必须转成单字符内容的string
str2 += 'c'; //+=支持单字符或者单字符内容的string
str3.push_back('c'); //push_back方式不支持单字符的string,必须为单字符形式
}
1.5 迭代器
append:ok
//iterator-range
void iterRangeAppend(string str1)
{
string str;
str.append(str1.begin(), str1.begin() + 2);
return;
}
1.6 C-string
append:ok +=:ok
//CSting
void CstringAppend(string str1, string str2)
{
char *chstr = "hello";
str1.append(chstr);
str2 += chstr;
return;
}
2、插入效率测试
?????????对比可以发现,append方式支持比较灵活,具体源码可以查看gcc或者msvc来查阅。这里针对三种方式都支持的单个字符的插入进行性能比较。分别在linux和windows下进行测试,为保证不同环境测试现象一致,且不同插入方式时间效率差距能明显比较, 测试插入字符次数为100W次,次数少差距不太明显。
测试代码如下:
#include <iostream>
#include <string>
#include <chrono>
using namespace std;
int main()
{
string str;
auto current_time = std::chrono::system_clock::now();
auto timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(current_time.time_since_epoch()).count();
cout << "for += begin timestamp: " << timestamp <<endl;
for(int i = 0; i < 10000000; i++)
{
str += '1';
}
current_time = std::chrono::system_clock::now();
timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(current_time.time_since_epoch()).count();
cout << "for += end timestamp: " << timestamp <<endl;
string str1;
current_time = std::chrono::system_clock::now();
timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(current_time.time_since_epoch()).count();
cout << "for append begin timestamp: " << timestamp <<endl;
for(int j = 0; j < 10000000; j++)
{
str1.append("1");
}
current_time = std::chrono::system_clock::now();
timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(current_time.time_since_epoch()).count();
cout << "for append end timestamp: " << timestamp <<endl;
string str2;
current_time = std::chrono::system_clock::now();
timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(current_time.time_since_epoch()).count();
cout << "for push_back begin timestamp: " << timestamp <<endl;
for(int z = 0; z < 10000000; z++)
{
str2.push_back('1');
}
current_time = std::chrono::system_clock::now();
timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(current_time.time_since_epoch()).count();
cout << "for push_back end timestamp: " << timestamp <<endl;
return 0;
}
3、测试结果
Windows:
+=耗时:2316
append耗时:2658
push_back耗时:1752
Linux:
+=耗时:63
append()耗时:100
push_back()耗时:57
由此可见,两个平台的耗时现象一致,append > += > push_back
时间复杂度:
+=:O(n)
append:O(n)
push_back:O(1)
如果针对某个字符串进行频繁的单字符插入时,采用push_back方式最优。
文章来源:https://blog.csdn.net/qq_39974998/article/details/135207140
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!