2013-11-08 3 views
9

Мне нравится консистенция. Недавно я задал вопрос об использовании std::begin против, например. std::vector<int>::begin, и единодушное решение, казалось, было использовать первое, поскольку оно более общее. Но я думаю, что нашел в грязи палку. Иногда вы хотите передать, что вы не измените контейнер, когда будете его прокручивать, поэтому вызываете std::vector<int>::cbegin. Это сделает ваш код довольно асимметричным, если вы иногда делали iter = v.cbegin(), а иногда делали iter = begin(v). Есть ли способ избежать этого недостатка симметрии, и не могли бы вы по-прежнему рекомендовать std::begin с учетом этих знаний? Почему C++ не имеет std::cbegin?Есть ли способ использовать автономный `std :: begin` и для const_iterator?

+9

Примечание: C++ будет иметь 'std :: cbegin' come C++ 14. –

+1

«Почему C++ не имеет ___» 1) Никто не хотел, чтобы этого было достаточно. 2) Он не очень хорошо вписывается в принципы C++ (не платите за то, что вы не используете, не принимаете много о платформе и т. Д.). 3) Ограничения по времени. 4) Надзор. В вашем случае, вероятно, 4. – GManNickG

+0

В прошлом году Николя Болас сказал, что это был недосмотр: http://stackoverflow.com/questions/12001410/what-is-the-reason-behind-cbegin-cend#comment16015196_12001519 Не уверен, что это правда но это вполне вероятно. – jogojapan

ответ

40

C++ 14 имеет cbegin/cend/etc. и он становится доступен в основных компиляторах.

+20

и «etc» Herb означает: 'cbegin/cend/rbegin/rend/crbegin/crend' –

3

Когда ваш контейнер объявлен «const», например, он передается функции как foo(const std::vector<int> & v), тогда std::begin фактически вернет const_iterator.

+6

Правильно ... но это не проблема. Например. если бы я использовал контейнер с 'std :: find', я бы использовал' std :: cbegin' и 'std :: cend' для согласования даже для контейнера non'const'. – user904963