итератор списка, не incrementable

Таким образом, я предлагаю добавить NC, чтобы он не зависел от регистра:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^submit?$ submit.php [NC, L]
RewriteRule ^(.+)$ search.php [NC, QSA,L]
6
задан Aman Aggarwal 9 February 2012 в 10:36
поделиться

7 ответов

Я переписал бы Ваш цикл, чтобы быть похожим на следующее:

while (iter != end())
{
  if (iter->arrivalTime == 0)
  {
    ReadyQueue::getInstance()->add(*iter);
    iter = erase(iter);
  }
  else
  {
    ++iter;
  }
}

Теперь Вы - правильно цикличное выполнение через список, проверяющий каждый индекс.

14
ответ дан 8 December 2019 в 04:32
поделиться

Заметьте это если iter->arrivalTime == 0, затем итератор списка увеличен дважды: однажды удаление элемента, и еще раз в конце цикла.

Если объект, который будет удален, будет последним объектом в списке, то это не будет, очевидно, работать правильно. Осмелюсь сказать, то, что это никогда не работало правильно даже в VS2003, но VS2005 предупреждает Вас об этом лучше.:-)

Помните, это - неопределенное поведение выполнить итерации мимо end(). Абсолютно что-либо может произойти, такие как катастрофический отказ программы или (в этом случае) сообщение об ошибке.

9
ответ дан 8 December 2019 в 04:32
поделиться

Я просто собираюсь игнорировать несколько строк Вашего кода для показа, где проблема заключается:

    for(iter = begin(); iter != end(); iter++) // ***
    {
        if(iter->arrivalTime == 0)
        {                       

                iter++; // ***

        }
    }

На этих двух строках отмеченный *** Вы увеличиваете итератор. Проблема состоит в том, что на второй из этих двух строк, Вы не проверяете, чтобы видеть, что Вы не пошли в конец контейнера. Эффективно при вхождении во внутренний цикл Вы увеличиваете дважды, но только проверяете, можете ли Вы увеличить однажды.

Одно решение состоит в том, чтобы проверить, являетесь ли Вы в end() прежде, чем сделать второй инкремент, но это смотрит на меня как Вы, пытаются формовать ту же операцию, как я был в своем вопросе только что, чтобы сделать с фильтрацией объектов от контейнера (карта в этом случае, но то же касается большинства контейнеров STL).

1
ответ дан 8 December 2019 в 04:32
поделиться

Я beliebe Chris прав. Однако другая проблема могла бы произойти от того, что Вы присваиваете итератору. – Итераторы списка, как гарантируют, будут присваиваемыми? Не смотря на стандарт, я не думаю поэтому, потому что присваиваемость нигде не упоминается в документации SGI итераторов.

0
ответ дан 8 December 2019 в 04:32
поделиться

Это - всего лишь заметка на полях, но важная.

Я предполагаю, что Вы наследовались a std::ist<PCB>. Я должен сказать: наследование для многократного использования функциональности не часто получалось хорошо для меня. Но так как Вы также 'наследовали' проект, нет ничего особенного для делания с этим...

0
ответ дан 8 December 2019 в 04:32
поделиться

Если Вы получающий "итератор списка, несовместимый", это, вероятно, потому что в Вашем "ReadyQueue:: getInstance ()-> добавляют (*iter)"; Вы изменяете что-то в *проход, который делает хеш-алгоритм, возвращает другое значение для стирания, чем это сделало во время вставки.

0
ответ дан 8 December 2019 в 04:32
поделиться

Я могу предложить более простой алгоритм?

Бесплатная функция std::remove_if может использоваться для разделения списка в 2, элементы, которые соответствуют или не соответствуют предикату (т.е. arrivalTime == 0). Это возвращает итератор, разделяющий диапазоны. Можно затем звонить ReadyQueue::getInstance()->add(subrange_begin, subrange_end) (у Вас действительно есть та перегрузка, правильно?) и стирание поддиапазон впоследствии.

Просто случай, где можно использовать алгоритмы STL вместо того, чтобы писать собственные циклы.

0
ответ дан 8 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

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