详解C++中StringBuilder类的实现及其性能优化

2020-01-06 15:08:05于海丽

最后,通过一个main函数调用以上实现的两个函数,将结果显示在控制台,然后执行性能测试:一个用于调试配置。 

C++,StringBuilder,StringBuilder用法,StringBuilder性能优化

另一个用于发行版本:

C++,StringBuilder,StringBuilder用法,StringBuilder性能优化

看到这百分比没?垃圾邮件的发送量都不能达到这个级别!

代码使用

在使用这段代码前, 考虑使用ostring流。正如你在下面看到Jeff先生评论的一样,它比这篇文章中的代码更快些。
你可能想使用这段代码,如果:
你正在编写由具有C#经验的程序员维护的代码,并且你想提供一个他们所熟悉接口的代码。
你正在编写将来会转换成.net的、你想指出一个可能路径的代码。
由于某些原因,你不想包含<sstream>。几年之后,一些流的IO实现变得很繁琐,而且现在的代码仍然不能完全摆脱他们的干扰。
要使用这段代码,只有按照main函数实现的那样就可以了:创建一个StringBuilder的实例,用Append()、AppendLine()和Add()给它赋值,然后调用ToString函数检索结果。
就像下面这样:


int main() {
  ////////////////////////////////////
  // 8-bit characters (ANSI)
  ////////////////////////////////////
  StringBuilder<char> ansi;
  ansi.Append("Hello").Append(" ").AppendLine("World");
  std::cout << ansi.ToString();
 
  ////////////////////////////////////
  // Wide characters (Unicode)
  ////////////////////////////////////
  // http://www.easck.com/wiki/Cargo_cult
  std::vector<std::wstring> cargoCult
  {
    L"A", L" cargo", L" cult", L" is", L" a", L" kind", L" of", L" Melanesian", L" millenarian", L" movement",
// many more lines here...
L" applied", L" retroactively", L" to", L" movements", L" in", L" a", L" much", L" earlier", L" era.n"
  };
  StringBuilder<wchar_t> wide;
  wide.Add(cargoCult.begin(), cargoCult.end()).AppendLine();
    // use ToString(), just like .net
  std::wcout << wide.ToString() << std::endl;
  // javascript-like join.
  std::wcout << wide.Join(L" _n") << std::endl;
 
  ////////////////////////////////////
  // Performance tests
  ////////////////////////////////////
  TestPerformance(wide, cargoCult);
#ifdef __USE_POSIX199309
  AccurateTestPerformance(wide, cargoCult);
#endif // def __USE_POSIX199309
  return 0;
}