std :: string :: assign vs std :: string :: operator =

时间:2015-12-10 07:30:44

标签: c++11 stdstring

我很久以前就用Borland C ++编写了代码,现在我正试图理解"新的"(对我来说)C + 11(我知道,我们在2015年,在那里" #39; sa c + 14 ......但我正在研究C ++ 11项目)

现在我有几种方法可以为字符串赋值。

#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;
}

他们都工作。我从http://www.cplusplus.com/reference/string/string/assign/了解到还有其他方法可以使用assign。但对于简单的字符串赋值,哪一个更好?我必须用8 std:string填充100多个结构,并且我正在寻找最快的机制(我不关心记忆,除非有很大的不同)

2 个答案:

答案 0 :(得分:9)

两者同样快,但= "..."更清晰。

如果你真的想要快速,请使用assign并指定尺寸:

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

这样,只需要一次分配。 (你也可以预先.reserve()足够的记忆来达到同样的效果。)

答案 1 :(得分:3)

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

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);

Here是图形化的临时解决方案。似乎两种方法都同样快。赋值运算符具有更好的结果。

仅在必须分配基本字符串中的特定位置时才使用string :: assign。