获取 std::string 反向副本的有效方法
Efficient way to get a reversed copy of std::string
处理算法任务时,我经常需要获取 reversed 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 方式的方法感兴趣。
My question is which approach I should prefer according to efficiency
根据效率应该首选的是经测量效率更高的那个。两者具有相同的渐近复杂度。
但是,除非恰好成为瓶颈,否则我不会费心去衡量差异。我更喜欢2,但它是主观的。
我可以说最初用正确的数据构建数据结构通常更快,但关于性能的一般性陈述通常是错误的。如果您关心性能,您应该衡量性能和基准。
如果您不太关心性能以编写基准代码,那么您应该采用最适合您的风格。
另外,你忘记了 C++20 风格:
auto reversed = sourceString | std::views::reverse;
std::string reversedString{begin(reversed), end(reversed)};
这最终与迭代器范围样式没有太大区别,因为字符串仍然需要一个迭代器对。
正如其他人所说,您应该首先决定什么对您的代码库、风格或速度更有意义。如果样式,只需使用 std::reverse
,其平均 运行 时间为 O(n)。如果速度是一个瓶颈,而你一直运行这种反向字符串方法,我会考虑创建一个双向链表。然后反转 LL 可以在 O(1) 运行 时间内发生。
处理算法任务时,我经常需要获取 reversed 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 方式的方法感兴趣。
My question is which approach I should prefer according to efficiency
根据效率应该首选的是经测量效率更高的那个。两者具有相同的渐近复杂度。
但是,除非恰好成为瓶颈,否则我不会费心去衡量差异。我更喜欢2,但它是主观的。
我可以说最初用正确的数据构建数据结构通常更快,但关于性能的一般性陈述通常是错误的。如果您关心性能,您应该衡量性能和基准。
如果您不太关心性能以编写基准代码,那么您应该采用最适合您的风格。
另外,你忘记了 C++20 风格:
auto reversed = sourceString | std::views::reverse;
std::string reversedString{begin(reversed), end(reversed)};
这最终与迭代器范围样式没有太大区别,因为字符串仍然需要一个迭代器对。
正如其他人所说,您应该首先决定什么对您的代码库、风格或速度更有意义。如果样式,只需使用 std::reverse
,其平均 运行 时间为 O(n)。如果速度是一个瓶颈,而你一直运行这种反向字符串方法,我会考虑创建一个双向链表。然后反转 LL 可以在 O(1) 运行 时间内发生。