从末尾到开始分配字符串字符



我一直在尝试各种方法来操作字符串和编写如下代码:

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';
}

相关内容

  • 没有找到相关文章

最新更新