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);。但基准测试结果不受影响