prepend std :: string

预置std::string的最有效方法是什么? 是否值得写出一个完整的函数呢,还是只需要1-2行呢? 我没有看到任何与std::string::push_front相关的东西。

实际上有一个和不存在的std::string::push_front类似的函数,参见下面的例子。


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 

由于在数据前面添加一个string可能需要对现有数据进行重新分配和复制/移动,您可以通过使用std::string::reserve (在手动分配更多的内存)中删除重新分配部分来获得一些性能优势。

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

那么,如果缓冲区足够大的话,你可以在不重新分配和移动数据的情况下前置和追加数据。 尽pipe如此,从源代码复制到目标仍然是显而易见的。


如果你有一个缓冲区,你知道你会预先加载数据的频率比你添加一个好的替代方法是将string向后存储,并在需要的时候反转(如果这种情况更为罕见)。

 myString.insert(0, otherString); 

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

这样做,这两个。

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

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

这不是就地,但创build一个新的string,所以不要指望它是有效的,但。 对于(可能)更有效的解决scheme,使用resize来收集空间, std::copy_backward将整个string移回一个,并在开始插入新的字符。

如果你使用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"); 

你应该注意到这样做效率相当低。