2014-03-25 85 views
1

我想将一个char附加到C++中的std :: string。我能想到的至少三种方式来做到这一点:将char添加到std :: string

std::string s = "hello"; 
char c = '!'; 

s += c; 
s.append(c); 
s.push_back(c); 
  • 其中一个被认为是最佳做法?
  • 是否存在性能差异(C++ 11)?

另外,如果我想要添加两个字符串,用同样的问题:

std::string s1 = "hello ", s2 = "world"; 

s1.append(s2); 
s1 += s2; 
+3

无论你喜欢什么。 – Rapptz

+3

应该没有性能差异。您的编译器应该为所有这些示例生成相同的代码。尽管这三种方法之间没有直接的区别,但他们可以做什么却有区别。例如,['string :: append()'](http://en.cppreference.com/w/cpp/string/basic_string/append)有几个重载。 'string :: push_back()'存在,所以容器可以用于泛型编程。 – 0x499602D2

回答

4

的问题是编译器和个人品味和/或公司的编码风格要求的问题。过载的操作符可能会解决您的第二个选择。

我会第一个去自己

其中一个被认为是最好的做法
2

如果您已经编写了一个接受各种容器类型(包括字符串)的模板,那么容器的API可能只有这些方法的一个子集 - 在这种情况下,最好使用它。

例如:

template <typename Container> 
void f(Container& c, int n) 
{ 
    if (n % 7) c.push_back(n); 
} 

这将与任何支持push_back工作 - 即std::vectorstd::dequestd::liststd::string。这与标准库容器的+=append相反,只有std::string才支持。

否则,做任何你认为最清晰的阅读 - 可能+=

是否存在性能差异(C++ 11)?

没有理由会出现在优化的代码中,尽管标准并不要求实现来确保这一点。 (谈到未优化代码的性能通常不是很有用,但是在未优化代码中可能有一个或多个可能会用另一个(即可能调用另一个函数)编写,如果内联不是'那么T做的不那么直接的代码可能是有史以来所以,稍微慢:这是可以在不同的实现而改变它会误导担心这一点)

另外,如果我想要添加两个字符串。同样的问题[...]

对于两个std::string s它有点复杂,因为有些hing这样...

template <typename Container, tyepname Value> 
void append_twice(Container& c, const Value& v) 
{ 
    c.push_back(v); 
    c.push_back(v); 
} 

...仍然可以用于vector,0123,和string,但是它通过隐式提取和附加char元素在字符串中执行语义上的不同操作,所以如果算法中后面的代码的正确行为取决于您,您可能希望避免支持所有类型在提取chars和从前面附加的容器中提取相同的string元素之间的区别。

再次没有性能差异。