什么是最有效的方式前置std::string
?是否值得写出一个完整的函数来完成,或者只需要1-2行?我没有看到与std::string::push_front
相关的任何内容。前置std ::字符串
回答
实际上存在与不存在的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
那样分配大缓冲区并将第一个内容放在此内存缓冲区的中心。
然后,如果缓冲区足够大,那么您可以在不重新分配数据和移动数据的情况下预先添加数据并追加数据。从来源复制到目的地尽管如此,显然仍然需要。
如果你有,你知道缓冲区你会前插往往比你追加一个很好的选择是存储字符串倒退,并在需要时反转(如果是比较少见数据)。
我还想补充一点,如果你需要在一个字符串中添加多个项目,你可以首先追加这些项目,然后使用
有一个超载string operator+ (char lhs, const string& rhs);
,所以你可以做your_string 'a' + your_string
来模仿push_front
。
这不是就地,但创建一个新的字符串,所以不要指望它是有效的,但。对于(可能)更高效的解决方案,请使用resize
来收集空间,std::copy_backward
将整个字符串向后移一位,并在开头插入新字符。
你应该**不要**使用'std :: string :: resize'来“收集更多空间”,如果需要的话,该函数会使内部缓冲区更大,这是真的。但它也会用'char()'(也被称为'NULL'(即值为0))填充当前字符串。参见[codepad paste](http://codepad.org/MxX3wH3d) –
如果您使用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");
你应该注意到,尽管如此,这样做效率却不高。
有人知道为什么这个答案是downvoted吗?它的声明是不正确的吗?我们是什么,读者5年后,意味着从不明原因的downvotes推断?这没有人帮助,有人可以详细说明,最后? –
myString.insert(0, otherString);
让标准模板库编写者担心效率;利用他们所有的工作时间,而不是重新编程车轮。
这样做的两个。
只要你使用的STL实现被认为是通过你会有高效的代码。如果你使用的是写得不好的STL,那么你就有更大的问题:)
效率低下的算法不能通过智能实现来拯救。 –
- 1. std :: vector中的push_back()<std::string>覆盖当前字符串
- 2. 字符串排序 - std :: set或std :: vector?
- 3. 更换的std ::字符串
- 4. jQuery - 查找字符串并将字符串前置到它?
- 5. 前置在字符串蟒每一行
- 6. 奇怪的错误 - std :: regex只匹配前两个字符串
- 7. 将某个字符串写入std之前的gdb中断:cerr
- 8. 如果字符串以子字符串开头,使用std :: equal
- 9. .NET系统::字符串到std ::字符串
- 10. 的std :: stringstream的阅读int和字符串,字符串中的
- 11. 如何将char字符串转换为std字符串
- 12. 置字符串
- 13. 使用std :: regex_token_iterator(不necessarilly)找到字符串中的字符位置
- 14. 将std字符串转换为nsstring
- 15. 动态插入字符串到std :: map
- 16. C++ std :: map字符串指针
- 17. STD字符串问题的libcurl - C++
- 18. 如何epur std ::字符串在c + +?
- 19. VISUALC++:字符串^和std :: vector的
- 20. C++ std:字符串内存模型
- 21. 转换的std :: string到V8 ::字符串
- 22. 如何设置从STD字符串的char *值(c_str())不工作
- 23. 字符串&字符串的设置值
- 24. 基本概念与std ::字符串引用,std :: regex和boost :: filesystem
- 25. std :: vector <std::string>插入空字符串代替
- 26. boost :: trim std :: vector中的每个字符串<std::string>
- 27. std :: stringstream输出不工作相同std ::字符串
- 28. 在字符串的子串之前插入字符串
- 29. 合并排序字符在一个std:字符串
- 30. 字符串的前缀
任何你不能做's = a + s'的原因吗? –
你的意思是什么? @MikeBantegui提到过吗?或者你正在尝试做其他事情? – Ankit
预先考虑一个字符串不会很高效,也许最好追加到字符串并在完成时将其反转。 – GWW