?
如果您已经编写了一个接受各种容器类型(包括字符串)的模板,那么容器的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)?
没有理由会出现在优化的代码中,尽管标准并不要求实现来确保这一点。 (谈到未优化代码的性能通常不是很有用,但是在未优化代码中可能有一个或多个可能会用另一个(即可能调用另一个函数)编写,如果内联不是'那么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
元素在字符串中执行语义上的不同操作,所以如果算法中后面的代码的正确行为取决于您,您可能希望避免支持所有类型在提取char
s和从前面附加的容器中提取相同的string
元素之间的区别。
再次没有性能差异。
无论你喜欢什么。 – Rapptz
应该没有性能差异。您的编译器应该为所有这些示例生成相同的代码。尽管这三种方法之间没有直接的区别,但他们可以做什么却有区别。例如,['string :: append()'](http://en.cppreference.com/w/cpp/string/basic_string/append)有几个重载。 'string :: push_back()'存在,所以容器可以用于泛型编程。 – 0x499602D2