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");
你应该注意到这样做效率相当低。