【发布时间】:2021-12-02 05:45:27
【问题描述】:
处理算法任务时,我经常需要得到一份反向的std::string。此外,不应修改源字符串。就我而言,有两种方法可以做到:
- 使用
std::reverse:
// std::string sourceString has been initialized before.
std::string reversedString = sourceString;
std::reverse(reversedString.begin(), reversedString.end());
- 使用反向迭代器。这是我在网上找到的:
// std::string sourceString has been initialized before.
std::string reversedString{sourceString.rbegin(), sourceString.rend()};
我的问题是,根据效率和最佳实践,我应该更喜欢哪种方法。 我不关心 C 风格的解决方案,我只对 STL 方式的方法感兴趣。
【问题讨论】:
-
效率可以是很多东西,所以你需要指定它。你想让算法快吗?还是您希望它使用尽可能少的内存?是只需要输出反向字符串还是需要存储?
-
要反转字符串中的字符,您将必须读取所有字符并将它们写入新位置(可能在奇数长度的中间字符的特殊情况下细绳)。您可以通过 N/2 交换(这是 std::reverse 所做的)或 N 个副本(这是创建新字符串所做的)来做到这一点。
-
显示的两种方法都只处理个人
chars。两者都没有正确处理多字节字符,即在 MBCS/UTF-8 字符串中使用 2+chars 的非 ASCII 字符。在这种情况下,您必须迭代sourceString转发,计算并提取完整的char序列,然后按原样插入reversedString的前面,从而保护每个序列的完整性,仅更改序列相对于其他序列的顺序。 -
为什么您需要一种有效的反转字符串的方法?