C++11 std::string::assign vs std::string::operator= 我在Borland C++中编码很久以前,现在我尝试理解“新”(对我)C++ 11(我知道,我们在2015,有一个C++ 14…但是我正在处理一个C++ 11项目)

C++11 std::string::assign vs std::string::operator= 我在Borland C++中编码很久以前,现在我尝试理解“新”(对我)C++ 11(我知道,我们在2015,有一个C++ 14…但是我正在处理一个C++ 11项目),c++11,stdstring,C++11,Stdstring,现在我有几种方法给字符串赋值 #include <iostream> #include <string> int main () { std::string test1; std::string test2; test1 = "Hello World"; test2.assign("Hello again"); std::cout << test1 << std::endl << test2; return 0

现在我有几种方法给字符串赋值

#include <iostream>
#include <string>
int main ()
{
  std::string test1;
  std::string test2;
  test1 = "Hello World";
  test2.assign("Hello again");

  std::cout << test1 << std::endl << test2;
  return 0;
}
#包括
#包括
int main()
{
std::字符串test1;
std::字符串test2;
test1=“你好世界”;
test2.assign(“再次你好”);

std::cout两者速度相同,但
=“…”
更清晰

如果确实需要快速,请使用
assign
并指定大小:

test2.assign("Hello again", sizeof("Hello again") - 1); // don't copy the null terminator!
// or
test2.assign("Hello again", 11);

这样,只需要一次分配。(您还可以事先保留足够的内存以获得相同的效果。)

我尝试了两种方法的基准测试

static void string_assign_method(benchmark::State& state) {
  std::string str;
  std::string base="123456789";  
  // Code inside this loop is measured repeatedly
  for (auto _ : state) {
    str.assign(base, 9);
  }
}
// Register the function as a benchmark
BENCHMARK(string_assign_method);

static void string_assign_operator(benchmark::State& state) {
  std::string str;
  std::string base="123456789";   
  // Code before the loop is not measured
  for (auto _ : state) {
    str = base;
  }
}
BENCHMARK(string_assign_operator);
是图形比较解决方案。似乎两种方法速度相同。赋值运算符的结果更好


仅当必须指定基字符串的特定位置时才使用string::assign。

小心不要将C字符串的尾随\0包含在std::string中,如果您以后尝试附加到它,这将对您造成影响。在上面的示例中,使用长度11,而不是12。@KilianRosbach Oops,您当然是对的。现在已修复。谢谢。我没有确定现在,快速板凳,它看起来是一个很棒的工具。对于C++ 11,很难看到,取决于编译器(CLAN,GCC)。一个或另一个更快。是的!它可以让你快速决定使用哪种方法。你也可以同时对两段以上的代码进行基准测试。string\u assign\u方法有一个小问题。它调用了std::string::assign的不正确重载。你实际上是在复制一个空字符串。你应该d do:str.assign(base,0,9);。但基准测试结果不受影响