我想知道为什么cbegin并cend在C++ 11中引入?
什么情况下使用这些方法时,使得从常量重载的差异begin和end?
这个问题涉及:
我什么时候应该使用新的ranged-for,我可以将它与新的cbegin/cend结合使用吗?
基于这个问题,强制使用cbegin()和cend()需要做的,例如:
for (auto& v: const_cast<decltype(container) const>(container))
Run Code Online (Sandbox Code Playgroud)
这是一个应该消除它的构造的很多样板代码.有更紧凑的方法吗?我的问题的原因是,隐式共享容器可能会将我的使用begin()作为分离自己的线索.
当然,C++ 11中新的ranged-for将非常简洁和有用.据我了解它是如何工作的,它会查找"容器" begin并end尝试*Argument-dependent-Lookup"(ADT).
但另一个补充是,所有容器现在都拥有cbegin()并cend()获得const_iterators容器.
我有点困惑,一方面是我想我应该用cbegin()我如果不是,要修改的容器,另一方面我必须添加额外的const内部范围,为获得同样的事情.
所以,它看起来像这样:
// print all
for(const auto elem : data)
cout << elem
Run Code Online (Sandbox Code Playgroud)
使用ADT,找到data.begin(),因此const需要.
VS
// print everything but the first (a reason not to use range-for)
for(auto it = data.cbegin()+1; it!=data.cend(); ++it)
cout << *it
Run Code Online (Sandbox Code Playgroud)
使用data.cbegin(),因此const不需要.
但这不是更"惯用"吗?:
// print everything but the first (a reason not to use range-for) …Run Code Online (Sandbox Code Playgroud) (另请参阅是否有一种很好的方法可以在C++中为自定义类型手写所有12个所需的Container函数?)
对于像这样的课程
namespace JDanielSmith {
class C
{
const size_t _size;
const std::unique_ptr<int[]> _data;
public:
C(size_t size) : _size(size), _data(new int[size]) {}
inline const int* get() const noexcept { return _data.get(); }
inline int* get() noexcept { return _data.get(); }
size_t size() const noexcept { return _size; }
};
}
Run Code Online (Sandbox Code Playgroud)
暴露迭代的首选方式是什么?我应该写begin()/ end()(和cbegin()/ cend())成员函数吗?
const int* cbegin() const {
return get();
}
const int* cend() const {
return cbegin() + size();
}
Run Code Online (Sandbox Code Playgroud)
或者这些应该是非会员职能? …