C++ 标准库容器为什么增加了 cbegin 和 cend 方法?

发布于 2022-09-07 04:13:01 字数 127 浏览 11 评论 0

C++11 之前的标准库容器对 begin 和 end 重载了常量对象和非常量对象版本,而在 11 中又对常量版本行定义了 cbegin 和 cend。

11 这样做的意义何在,也即这样的设计,相比 11 之前有什么优势?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

未蓝澄海的烟 2022-09-14 04:13:01

cbegin和cend等是在c++14開始添加的, 並非c++11

TL;DR, 是爲了更方便的獲得常量迭代器.
在c++14以前, 你像要得到常量迭代器, 方法比較繁瑣:

typedef vector<MyType> vect;
typedef vect::const_iterator c_iter;
vect v;
// alternatives:
c_iter it = const_cast<vect const &>(v).begin(); // 1
c_iter it = static_cast<c_iter>( v.begin() ); // 2 (explicit)
c_iter it = v.begin(); // 2 (implicit)

雖然現在const有被濫用的趨勢, 但是該用的時候還是要用, 比如fold, 或者其在c++中的等價函數, std::accumulate, 不需要懟迭代器指向的成員進行修改, 此時const-qualify有其合理性.

再者, 其實現也非常簡單, 利用現有設施很容易, 不會破壞core laungage:

const_iterator cbegin() const;
const_iterator cend () const;

最後, 它與c++0x的其它特性, 比如auto/decltype可以相互配合, 威力成倍增強, 比如如果沒有cbegin, auto只能得到non-const版本.

其實這種問題最好的解決方法就是去 wg21 看其在2004年的提案, http://www.open-std.org/jtc1/...

更新:

窩跟你說...這裏有人在c++14出臺之前抱怨爲什麼沒有const 版本的std::begin()抱怨, 然後草藥大叔親自登場了...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文