[c++] В чем причина cbegin / cend?



Answers

Помимо того, что Никол Болас сказал в своем ответе , рассмотрите новое ключевое слово auto :

auto iterator = container.begin();

С auto способом невозможно гарантировать, что begin() возвращает константный оператор для ссылки на непостоянный контейнер. Итак, теперь вы делаете:

auto const_iterator = container.cbegin();
Question

Интересно, почему cbegin и cend были введены в C ++ 11?

Каковы случаи, когда вызов этих методов имеет значение от перегрузки const от begin и до end ?




iterator и const_iterator имеют отношение наследования и неявное преобразование происходит по сравнению с другим типом или назначается другому типу.

class T {} MyT1, MyT2, MyT3;
std::vector<T> MyVector = {MyT1, MyT2, MyT3};
for (std::vector<T>::const_iterator it=MyVector.begin(); it!=MyVector.end(); ++it)
{
    // ...
}

Использование cbegin() и cend() приведет к увеличению производительности в этом случае.

for (std::vector<T>::const_iterator it=MyVector.cbegin(); it!=MyVector.cend(); ++it)
{
    // ...
}



С http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1674.pdf :

так что программист может непосредственно получить const_iterator из даже неконстантного контейнера

Они дали этот пример

vector<MyType> v;

// fill v ...
typedef vector<MyType>::iterator iter;
for( iter it = v.begin(); it != v.end(); ++it ) {
    // use *it ...
}

Однако, когда обход контейнера предназначен только для проверки, обычно рекомендуется использовать const_iterator, чтобы позволить компилятору диагностировать нарушения состязательности

Обратите внимание, что рабочий документ также упоминает шаблоны адаптеров, которые теперь были завершены как std::begin() и std::end() а также работают с собственными массивами. Соответствующие std::cbegin() и std::cend() любопытно отсутствуют с этого времени, но они также могут быть добавлены.




Related