Я должен предпочесть итераторы по const_iterators?

Вы можете изменить «диапазон» обнаружения. Если вы посмотрите на то, как вы обнаруживаете свои автомобили, вы ищете только координату, в которой расположен спрайт / вектор, для которой будет относительно трудно столкнуться, если будет более нескольких пикселей. , Попробуйте найти положение Car A из width/length из Car B.

27
задан Community 23 May 2017 в 12:00
поделиться

5 ответов

Я полностью согласен с вами. Я думаю, что ответ прост: Используйте const_iterators, где значения const правильные, и наоборот. Мне кажется, что те, кто против const_iterators, должны быть против const вообще ...

22
ответ дан 28 November 2019 в 05:24
поделиться

Я не думаю, что это конкретное утверждение Мейера нужно воспринимать с особой заботой. Если вам нужна немодифицирующая операция, лучше всего использовать const_iterator. В противном случае используйте обычный iterator. Однако обратите внимание на одну важную вещь: никогда не смешивайте итераторы, то есть const с итераторами non-const. Пока вы знаете о последнем, с вами все будет в порядке.

3
ответ дан dirkgently 28 November 2019 в 05:24
поделиться

При прочтении этой ссылки Мейерс, по-видимому, в основном говорит, что интегратор лучше, чем const_interator, потому что вы не можете вносить изменения через const_iterator.

Но если это то, что он говорит, то Мейерс на самом деле не прав. Именно поэтому const_iterator лучше, чем итератор, когда это то, что вы хотите выразить.

2
ответ дан 28 November 2019 в 05:24
поделиться

Вот немного другой взгляд на это. Const_iterator почти никогда не имеет смысла, когда вы передаете его в качестве указателя на конкретную коллекцию и вы также передаете коллекцию. Г-н. Мейер специально заявил, что const_iterator нельзя использовать с большинством функций-членов экземпляра коллекции. В этом случае вам понадобится старый итератор . Однако, если у вас нет дескриптора к коллекции, единственное различие между ними состоит в том, что вы можете изменить то, что указано на с помощью итератора , и вы не можете изменить объект, на который ссылается const_iterator .

Итак ... вы хотите использовать итератор всякий раз, когда вы передаете коллекцию и позицию в коллекцию алгоритму. По сути, такие подписи, как:

void some_operation(std::vector<int>& vec, std::vector::const_iterator pos);

не имеют большого смысла. Неявное утверждение состоит в том, что some_operation может свободно изменять базовую коллекцию, но не имеет права изменять то, на что ссылается pos . Это не имеет особого смысла. Если вы действительно этого хотите, то pos должен быть смещением, а не итератором.

С другой стороны, большинство алгоритмов в STL основаны на диапазонах, заданных парой итераторов. Сама коллекция никогда не передается, поэтому разница между iterator и const_iterator заключается в том, можно ли изменить значение в коллекции с помощью итератора или нет. Без ссылки на коллекцию, разделение довольно четкое.

Надеюсь, это сделало вещи такими же ясными, как грязь;)

Сама коллекция никогда не передается, поэтому разница между iterator и const_iterator заключается в том, можно ли изменить значение в коллекции с помощью итератора или нет. Без ссылки на коллекцию, разделение довольно четкое.

Надеюсь, это сделало вещи такими же ясными, как грязь;)

Сама коллекция никогда не передается, поэтому разница между iterator и const_iterator заключается в том, можно ли изменить значение в коллекции с помощью итератора или нет. Без ссылки на коллекцию, разделение довольно четкое.

Надеюсь, это сделало вещи такими же ясными, как грязь;)

9
ответ дан 28 November 2019 в 05:24
поделиться

Я обычно предпочитаю константу, но недавно столкнулся с головоломкой с const_iterators, которая сбивает меня с толку "всегда использовать const были Возможная "философия:

MyList::const_iterator find( const MyList & list, int identifier )
{
    // do some stuff to find identifier
    return retConstItor;
}

Поскольку для передачи ссылки на константный список мне требовалось использовать только константные итераторы, теперь, если я использую find, я не могу ничего сделать с результатом, но могу посмотреть на него, хотя все, что я хотел сделать, это выразить find не изменит передаваемый список.

Я, возможно, задаюсь вопросом, имеет ли совет Скотта Майерса отношение к таким вопросам, когда становится невозможным избежать константности. Насколько я понимаю, вы не можете (надежно) un-const const_iterators с простым приведением из-за некоторых внутренних деталей. Это также (возможно, вместе) проблема.

это, вероятно, актуально: Как удалить постоянство const_iterator?

3
ответ дан 28 November 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: