【发布时间】:2013-05-29 06:08:18
【问题描述】:
我正在检索和存储可以使用 std::string::erase 或 std::string::substr 的字符串的一部分。
我想知道以下哪种方法更快(完成时间更短)和高效(更少的内存分配/重新分配)。此外,有关擦除和 substr 如何分配/重新分配内存的任何信息都将非常有帮助。谢谢!
std::string nodeName("ABCD#XYZ#NodeName");
const std::string levelSeparator("#");
选项 1:使用 std::string::substr
std::string::size_type nodeNameStartPosition = nodeName.rfind(levelSeparator);
if (nodeNameStartPosition != std::string::npos)
{
nodeNameStartPosition += levelSeparator.length();
nodeName = nodeName.substr(nodeNameStartPosition);
}
选项 2:使用 std::string::erase
std::string::size_type nodeNameStartPosition = nodeName.rfind(levelSeparator);
if (nodeNameStartPosition != std::string::npos)
{
nodeNameStartPosition += levelSeparator.length();
nodeName = nodeName.erase(0, nodeNameStartPosition);
}
【问题讨论】:
-
这个比较有什么意义?两者做不同的事情。如果要获取子字符串,请执行
substr。如果要从字符串中删除,请使用erase。 -
@LuchianGrigore:我需要获取我有这两个选项的原始字符串的“NodeName”部分。我现在正在使用 substr,但只是想知道即使 substr 看起来很直观,使用擦除来满足这个要求是否会更好。
-
@lc2817:我不确定如何检查内存分配/重新分配。
-
@KK_35、valgrind.org 或谷歌“内存分配分析器 c++”
-
@KK_35 请使用
substr,即使奇迹般地erase更快(我真的怀疑)。您所说的“直观”极大地弥补了任何性能损失(尽管可能没有)。