cbegin реализуется, как показано ниже:
template <class C>
auto cbegin(const C& container)->decltype(std::begin(container))
{
return std::begin(container); // see explanation below
}
соответствующие начинаются, как показано ниже.
template< class C >
auto begin(C& c) -> decltype(c.begin()); //calling container's begin
Этого шаблон cbegin принимает любой тип аргумента , представляющей структуру данных контейнера типа, C, и он обращается к этому аргументу через ссылку-к-сопзИте параметр, контейнер. Если C является обычным контейнером типа (например, std :: vector), то контейнер будет ссылкой на версию этого контейнера const (например, const std :: vector &). Вызов функции nonmember begin (предоставленный C++ 11) в контейнере const дает команду const_iterator , и этот итератор возвращает этот шаблон.
Например, если я использовал вектор в качестве аргумента для cbegin
, как показано ниже.
std::vector<int> v1;
std::cbegin(v1);
Теперь посмотрим, как шаблон вычет произошло в этом случае шаблон (класс C) выводится как вектор и параметр cbegin
(сопзЬ C & контейнера), выведенную быть const vector<int> &
. Теперь, поскольку контейнер сам по себе является постоянным, он будет возвращать постоянную версию начала вектора.
iterator begin();
const_iterator begin() const; //This will be used .
const_iterator cbegin() const;
Я согласен с тем, что страница может быть немного понятнее и не позволять людям рассуждать об этом (как это сделано в данных ответах). Кроме того, объяснение, почему введен cbegin (чтобы гарантировать стабильность, а не только полагаться на константу параметра), может помочь. – stefaanv