Ошибка при сравнении итераторов c ++ [duplicate]

Раздел, описанный в руководстве. Список разделов документируется в руководстве пользователя. Например:

man 1 man
man 3 find

Это полезно, если существуют одинаковые или точно равные команды в разных разделах

1
задан stackptr 17 January 2016 в 17:15
поделиться

2 ответа

Из комментариев и ответа sftrabbit вы можете видеть, что реляционные операторы определены только для итераторов произвольного доступа, а std::list имеет только двунаправленные итераторы. Поэтому для вашей проблемы существует несколько решений:

  1. Используйте std::vector или std::array. Они предоставляют итераторы с произвольным доступом, имеют лучшую производительность для меньших размеров и в зависимости от того, как вы их заполняете и используете для больших размеров, а также имеют лучший размер памяти. Это предпочтительное решение, я бы назвал его «стандартным» решением. Используйте другие контейнеры только в том случае, если существует очень хорошая измеримая причина (например, профилировщик говорит вам, что использование этого контейнера является узким местом производительности).
  2. Поскольку вы знаете размер списка, вы можете использовать счетчик для ваших итераций:
    for (size_t i = 0, count = families.size()/2; 
         i < count; 
         ++i, --itSmallFamily, ++itLargeFamily)
    { /* do stuff */ }
    
  3. Поскольку ваш список отсортирован, вы можете сравнить элементы, на которые указывают итераторы, вместо самих итераторов.
1
ответ дан Arne Mertz 22 August 2018 в 10:40
поделиться
  • 1
    Спасибо. для 3. Я использую довольно сложные «family.sort (compare_size)». код (не очень сложный, но достаточно, чтобы записать его где-то еще итерационный код. – PIXP 8 April 2013 в 11:16
  • 2
    @PIXP, поэтому только 3-й список в списке ;-) Если сравнение дорогое, это не вариант. – Arne Mertz 8 April 2013 в 12:45
  • 3
    не дорогостоящий со временем выполнения, больше похож на громоздкий. и комментарий был для будущих читателей ... – PIXP 8 April 2013 в 14:48

Заказываются только итераторы произвольного доступа. std::list итераторы - это только двунаправленные итераторы, поэтому они не поддерживают operator< или operator>.

Вместо этого вы могли бы провести сравнение с !=.

while (itSmallFamily != itLargeFamily)

Вы должны убедиться, что итераторы не перепрыгивают друг на друга, чтобы это работало. То есть, если itSmallFamily находится только на один шаг от itLargeFamily, вы просто поменяете их и они никогда не будут равны друг другу.

Вместо этого вы можете использовать std::vector, чьи итераторы являются итераторами произвольного доступа. Кроме того, std::array и std::deque также поддерживают произвольный доступ.

3
ответ дан Joseph Mansfield 22 August 2018 в 10:40
поделиться
  • 1
    Спасибо за быстрый ответ. так что я думаю, что я ничего не пропустил, это просто отсутствие базовых знаний на моей стороне. существуют ли итераторы (из других контейнеров), которые можно сравнить с контейнером, как я описал? – PIXP 8 April 2013 в 10:58
  • 2
    Это будет работать, только если (families.size() % 2) == 0 , поскольку эти итераторы никогда не будут одинаковыми. – Arne Mertz 8 April 2013 в 10:58
  • 3
    @PIXP std::vector имеет итераторы произвольного доступа. – Joseph Mansfield 8 April 2013 в 11:00
  • 4
    @sftrabbit заключается в том, что другое определение "упорядоченного" чем , это ? – Drew Dormann 8 April 2013 в 11:00
  • 5
    @PIXP: std::vector почти всегда лучший выбор, чем std::list. std::list хорошо, если вы делаете много вставок в произвольных местах и , число элементов значимо (сотни, а может быть, и тысячи). – Thomas 8 April 2013 в 11:01
Другие вопросы по тегам:

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