2011-12-12 52 views
37

什么是最有效的方式前置std::string?是否值得写出一个完整的函数来完成,或者只需要1-2行?我没有看到与std::string::push_front相关的任何内容。前置std ::字符串

+2

任何你不能做's = a + s'的原因吗? –

+0

你的意思是什么? @MikeBantegui提到过吗?或者你正在尝试做其他事情? – Ankit

+0

预先考虑一个字符串不会很高效,也许最好追加到字符串并在完成时将其反转。 – GWW

回答

55

实际上存在与不存在的std::string::push_front类似的功能,请参见下面的示例。


Documentation of std::string::insert

#include <iostream> 
#include <string> 

int 
main (int argc, char *argv[]) 
{ 
    std::string s1 (" world"); 
    std::string s2 ("ello"); 

    s1.insert (0,  s2); // insert the contents of s2 at offset 0 in s1 
    s1.insert (0, 1, 'h'); // insert one (1) 'h'  at offset 0 in s1 

    std::cout << s1 << std::endl; 
} 

输出:

hello world 

由于前面加上一个字符串数据可能同时需要重新分配并复制现有数据/移动你可以得到一些性能优势通过使用std::string::reserve摆脱重新分配部分(分配更多记忆之前)。

数据的复制/移动非常不可避免,除非您定义自己定制的类,类似std::string那样分配大缓冲区并将第一个内容放在此内存缓冲区的中心。

然后,如果缓冲区足够大,那么您可以在不重新分配数据和移动数据的情况下预先添加数据并追加数据。从来源复制到目的地尽管如此,显然仍然需要。


如果你有,你知道缓冲区你会前插往往比你追加一个很好的选择是存储字符串倒退,并在需要时反转(如果是比较少见数据)。

+0

我还想补充一点,如果你需要在一个字符串中添加多个项目,你可以首先追加这些项目,然后使用中的std :: rotate将它们旋转到前面,以避免二次时间性能。 –

3

有一个超载string operator+ (char lhs, const string& rhs);,所以你可以做your_string 'a' + your_string来模仿push_front

这不是就地,但创建一个新的字符串,所以不要指望它是有效的,但。对于(可能)更高效的解决方案,请使用resize来收集空间,std::copy_backward将整个字符串向后移一位,并在开头插入新字符。

+0

你应该**不要**使用'std :: string :: resize'来“收集更多空间”,如果需要的话,该函数会使内部缓冲区更大,这是真的。但它也会用'char()'(也被称为'NULL'(即值为0))填充当前字符串。参见[codepad paste](http://codepad.org/MxX3wH3d) –

0

如果您使用std::string::append,你应该意识到,以下是等价的:

std::string lhs1 = "hello "; 
std::string lh2 = "hello "; 
std::string rhs = "world!"; 

lhs1.append(rhs); 
lhs2 += rhs; // equivalent to above 
// Also the same: 
// lhs2 = lhs + rhs; 

同样,“前置”将等同于以下内容:

std::string result = "world"; 
result = "hello " + result; 
// If prepend existed, this would be equivalent to 
// result.prepend("hello"); 

你应该注意到,尽管如此,这样做效率却不高。

+5

有人知道为什么这个答案是downvoted吗?它的声明是不正确的吗?我们是什么,读者5年后,意味着从不明原因的downvotes推断?这没有人帮助,有人可以详细说明,最后? –

4
myString.insert(0, otherString); 

让标准模板库编写者担心效率;利用他们所有的工作时间,而不是重新编程车轮。

这样做的两个。

只要你使用的STL实现被认为是通过你会有高效的代码。如果你使用的是写得不好的STL,那么你就有更大的问题:)

+4

效率低下的算法不能通过智能实现来拯救。 –

相关问题