gpt4 book ai didi

字符串连接的 C++ 开销

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:18:31 26 4
gpt4 key购买 nike

我正在从 ifstream 中读取随机 ascii 文本文件。我需要能够将整个消息放入字符串类型以进行字符解析。我当前的解决方案有效,但我认为我通过使用等效于此的方式来谋杀更冗长文件的处理时间:

std::string result;

for (std::string line; std::getline(std::cin, line); )
{
result += line;
}

我担心与像这样连接字符串相关的开销(这种情况发生了数千次,消息长度为 10 的数千个字符)。在过去的几天里,我一直在浏览不同的潜在解决方案,但没有什么是非常合适的……我不知道提前消息的长度,所以我不认为使用动态大小的字符数组是我的答案.

我通读了this SO thread这听起来几乎适用,但仍然让我不确定;

有什么建议吗?

最佳答案

真正的问题是您无法提前知道完整的大小,因此您无法适本地分配内存。我希望您获得的性能影响与此有关,而不是与 string 的连接方式有关,因为它在标准库中有效地完成了。

因此,我建议推迟串联,直到您知道最终字符串 的完整大小。也就是说,您首先将所有字符串存储在一个大的 vector 中,如下所示:

using namespace std;
vector<string> allLines;
size_t totalSize = 0;
// If you can have access to the total size of the data you want
// to read (size of the input file, ...) then just initialize totalSize
// and use only the second code snippet below.
for (string line; getline(cin, line); )
{
allLines.push_back(line);
totalSize += line.size();
}

然后,您可以创建您的大字符串,并预先知道它的大小:

string finalString;
finalString.reserve(totalSize);
for (vector<string>::iterator itS = allLines.begin(); itS != allLines.end(); ++itS)
{
finalString += *itS;
}

尽管如此,我还是要提一下,只有在遇到性能问题时才应该这样做。不要试图优化不需要的东西,否则你会使你的程序复杂化而没有明显的好处。我们需要优化的地方通常是违反直觉的,并且可能因环境而异。因此,只有当您的分析工具告诉您需要时才这样做。

关于字符串连接的 C++ 开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15844074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com