我想在C ++中将一个char附加到std :: string。我至少可以想到三种方法:
std::string s = "hello";
char c = '!';
s += c;
s.append(c);
s.push_back(c);
另外,如果我想添加两个字符串,同样的问题:
std::string s1 = "hello ", s2 = "world";
s1.append(s2);
s1 += s2;
答案 0 :(得分:4)
问题在于编译器和个人品味和/或公司编码风格要求。过载的操作员可能会解决您的第二选择。
我自己会先找第一个
答案 1 :(得分:2)
哪一个被认为是最佳做法?
如果您编写的模板接受包括字符串在内的各种容器类型,则容器的API可能只有这些方法的一个子集 - 在这种情况下,最好使用它。
例如:
template <typename Container>
void f(Container& c, int n)
{
if (n % 7) c.push_back(n);
}
这适用于支持push_back
的任何内容 - 即std::vector
,std::deque
,std::list
,std::string
。这与标准库容器中的+=
和append
形成鲜明对比,只有std::string
支持。
否则,做任何你认为最清楚的事情 - 可能是+=
。
是否存在性能差异(C ++ 11)?
没有理由在优化代码中,虽然标准不要求实现以确保。
(谈论未经优化的代码的性能通常不常用,但在未经优化的代码中FWIW可能有一个或多个可能用另一个来写(即它可能调用另一个函数),如果内联不是然后,较不直接的代码可能会稍微慢一些:这可能会因实现而异。如果担心这一点会被误导。)
另外,如果我想添加两个字符串,同样的问题[...]
对于两个std::string
s,它有点复杂,就像这样......
template <typename Container, tyepname Value>
void append_twice(Container& c, const Value& v)
{
c.push_back(v);
c.push_back(v);
}
...仍可用于vector
,deque
,list
和string
,但它通过隐式提取和附加{对字符串执行语义上的不同操作{ {1}}元素,因此如果算法中后续代码的正确行为取决于提取char
和从中提取相同char
元素之间的差异,您可能希望避免支持所有类型先前附加的容器。
再次没有性能差异。