Как я могу прекратить итерацию «n» до конца карты, когда итераторы не имеют произвольного доступа? - PullRequest
3 голосов
/ 27 февраля 2011

Я хотел бы просмотреть карту в C ++ с итераторами, но не до конца.Проблема в том, что даже если мы можем выполнять базовые операции с итераторами, мы не можем добавлять и сравнивать итераторы с целыми числами.Как я могу написать следующие инструкции?(final - карта; window, целое число)

for (it=final.begin(); it!=final.end()-window; it++)

Ответы [ 4 ]

5 голосов
/ 27 февраля 2011

Вы не можете напрямую вычитать из итератора карты, потому что это дорогостоящая операция (на практике это делается --iter необходимое количество раз)Если вы действительно хотите это сделать, вы можете использовать стандартную библиотечную функцию 'advance'.

map<...>::iterator end = final.end();
std::advance(end, -window);

Это даст вам конец вашего окна.

3 голосов
/ 27 февраля 2011
std::map<T1, T2>::iterator it = final.begin();
for (int i = 0; i < final.size()-window; ++i, ++it)
{
  // TODO: add your normal loop body
}

Заменить T1 и T2 фактическими типами ключей и значений карты.

0 голосов
/ 27 февраля 2011

Другое решение:

size_t count=final.size();
size_t processCount=(window<count?count-window:0);
for (it=final.begin(); processCount && it!=final.end(); ++it, --processCount)
{
  // loop body
}

Это немного безопаснее:

  • Он учитывает случай, когда ваша карта на самом деле меньше значения window.
  • Он будет обрабатывать не более processCount элементов, даже если вы измените размер вашей карты внутри цикла (например, добавьте новые элементы)
  • Согласно STL, size() может потребоваться O (n) времени для вычисления, хотя обычные реализации могут сделать это в O (1). Чтобы быть в безопасности, лучше не вызывать size () много раз, если в этом нет необходимости.
  • 'end ()', с другой стороны, амортизирует постоянное время, поэтому должно быть в порядке, чтобы оно было в состоянии цикла for
  • ++it может быть быстрее, чем it++. Оператор постинкрементного создает временный объект, а другой - нет. Когда переменная является простым целочисленным типом, компилятор может оптимизировать ее, но с итераторами это не всегда так.
0 голосов
/ 27 февраля 2011

Почему бы и вам не сделать итератор?

См. Пример здесь: http://www.cplusplus.com/reference/stl/map/begin/

...