将char添加到std :: string

时间:2014-03-25 01:14:16

标签: c++

我想在C ++中将一个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;

2 个答案:

答案 0 :(得分:4)

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

我自己会先找第一个

答案 1 :(得分: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)?

没有理由在优化代码中,虽然标准不要求实现以确保。

(谈论未经优化的代码的性能通常不常用,但在未经优化的代码中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);
}

...仍可用于vectordequeliststring,但它通过隐式提取和附加{对字符串执行语义上的不同操作{ {1}}元素,因此如果算法中后续代码的正确行为取决于提取char和从中提取相同char元素之间的差异,您可能希望避免支持所有类型先前附加的容器。

再次没有性能差异。