c++ - const 字符串仍然更可取吗?

标签 c++ arrays string algorithm iterator

我在这里问了一个关于迭代器的问题:Prefer Iterators Over Pointers?结果,我开始了解他们提供的一些保护和调试功能。

不过,我相信beginend现在在 C 风格数组上提供类似的可能性。

如果我想创建一个只会在 STL 算法中迭代的 const string,使用 const string 是否仍然有优势,或者我应该更喜欢const char[] with beginend?

最佳答案

所以答案取决于您使用的 c++ 版本

C++98

因为 C++98 没有 std::beginstd::end最好的办法就是接受你将不得不支付 build 成本并使用 std::string。如果您有可用的提升,您仍然应该考虑 boost::string_ref有两个原因。首先,它的构造将始终避免分配,总体上比 std::string 简单得多。

boost::string_ref 起作用是因为它只存储指向字符串的指针和长度。因此,在所有情况下开销都是最小的。

c++11

与 C++98 非常相似,除了使用 boost::string_ref 的建议变得MUCH 更强大,因为 c++11 有 constexpr这允许编译器通过在编译时构造对象来完全绕过构造。

c++1z

据称(这不是最终版本)图书馆基础知识 TS 将为我们带来 std::string_view . boost::string_ref 是早期提议的 std::string_view 的原型(prototype),旨在以某种形式将功能引入所有版本的 C++。

关于 C++14 字符串文字

C++14 引入了语法为 "foo"s 的字符串文字不幸的是,这只是一种方便。因为 operator""s 不是 constexpr,它不能在编译时求值,因此不能避免构造带来的惩罚。所以它可以用来使代码看起来更漂亮,但在这种情况下它没有提供任何其他好处。

关于c++ - const 字符串仍然更可取吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29166578/

相关文章:

c++ - 模板的 typedef 包括 char[][] - 适用于 VS2008 但不适用于 gcc

c++ - 当 `virtual` 是一个相当大的开销时,是否有任何经验法则?

javascript - Lodash/underscore 函数使用给定长度的默认空值初始化数组

ruby - 如何计算字符串中两个字符之间的字符数

c++ - Win7 C++ 应用程序每次分配总是保留至少 4k 内存

c++ - 如何创建 noexcept 函数指针?

python - X Y 坐标的 Numpy 数组到 Pandas 数据框

ruby - 将一个大数组解析为多个子数组

.net - 递归地将字符串拆分为字符列表

r - 将双字字符串中两个单词的第一个字母大写