我一直在尝试各种方法来操作字符串和编写如下代码:
std::string a = "abcde";
std::string b;
b.resize(a.length());
int times = a.length();
while (times > 0)
{
b[times - 1] = a[b.length() - times];
times--;
}
std::cout << b << 'n';
return 0;
这个想法是调整字符串的大小,然后逐个索引设置单个字符。现在代码工作了,但几天前我得到分割错误(请注意,我不记得代码是完全相同的这一个)。
问题是,这是一段合法的代码(让我们说,当我想从头到尾填充字符串而不使用插入和反转)?
这看起来没有错,但是这类代码很容易出错,你必须通读一遍才能弄清楚意图是什么。
嗯…一般来说,容器的思想是使用迭代器符号。当然,它们也是字符串,有时您无法避免进行索引操作。
但是对于这种情况,您可以通过使用insert方法和反向迭代器范围或迭代器范围构造函数快速反转字符串,例如:
std::string b {a.rbegin(), a.rend()};
有很多方法
我在你发布的代码中没有看到分割错误的原因。
但是有几种更优雅的方法来反转字符串。
最好的方法可能是使用反向迭代器,如其他答案所示。
另一种选择是使用std::reverse
:
#include <string>
#include <algorithm>
#include <iostream>
int main()
{
std::string a = "abcde";
std::string b = a;
std::reverse(b.begin(), b.end()); // <---
std::cout << a << 'n';
std::cout << b << 'n';
}
输出:
abcde
edcba
这里唯一的缺点是,在这种情况下,每个字符实际上被复制两次(一次在初始赋值时,一次在std::reverse
期间)。
在c++中可以更容易地反转字符串
#include <algorithm>
#include <iostream>
#include <string>
int main() {
std::string a = "abcde";
std::string b;
b.resize(a.length());
std::copy(a.rbegin(), a.rend(), b.begin());
std::cout << b << 'n';
}
如果b
是一个新变量,而不是一个现有的要修改的变量,那么可以用声明行
#include <algorithm>
#include <iostream>
#include <string>
int main() {
std::string a = "abcde";
std::string b(a.rbegin(), a.rend());
std::cout << b << 'n';
}