Таким образом, я предлагаю добавить NC, чтобы он не зависел от регистра:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^submit?$ submit.php [NC, L]
RewriteRule ^(.+)$ search.php [NC, QSA,L]
Я переписал бы Ваш цикл, чтобы быть похожим на следующее:
while (iter != end())
{
if (iter->arrivalTime == 0)
{
ReadyQueue::getInstance()->add(*iter);
iter = erase(iter);
}
else
{
++iter;
}
}
Теперь Вы - правильно цикличное выполнение через список, проверяющий каждый индекс.
Заметьте это если iter->arrivalTime == 0
, затем итератор списка увеличен дважды: однажды удаление элемента, и еще раз в конце цикла.
Если объект, который будет удален, будет последним объектом в списке, то это не будет, очевидно, работать правильно. Осмелюсь сказать, то, что это никогда не работало правильно даже в VS2003, но VS2005 предупреждает Вас об этом лучше.:-)
Помните, это - неопределенное поведение выполнить итерации мимо end()
. Абсолютно что-либо может произойти, такие как катастрофический отказ программы или (в этом случае) сообщение об ошибке.
Я просто собираюсь игнорировать несколько строк Вашего кода для показа, где проблема заключается:
for(iter = begin(); iter != end(); iter++) // ***
{
if(iter->arrivalTime == 0)
{
iter++; // ***
}
}
На этих двух строках отмеченный *** Вы увеличиваете итератор. Проблема состоит в том, что на второй из этих двух строк, Вы не проверяете, чтобы видеть, что Вы не пошли в конец контейнера. Эффективно при вхождении во внутренний цикл Вы увеличиваете дважды, но только проверяете, можете ли Вы увеличить однажды.
Одно решение состоит в том, чтобы проверить, являетесь ли Вы в end()
прежде, чем сделать второй инкремент, но это смотрит на меня как Вы, пытаются формовать ту же операцию, как я был в своем вопросе только что, чтобы сделать с фильтрацией объектов от контейнера (карта в этом случае, но то же касается большинства контейнеров STL).
Я beliebe Chris прав. Однако другая проблема могла бы произойти от того, что Вы присваиваете итератору. – Итераторы списка, как гарантируют, будут присваиваемыми? Не смотря на стандарт, я не думаю поэтому, потому что присваиваемость нигде не упоминается в документации SGI итераторов.
Это - всего лишь заметка на полях, но важная.
Я предполагаю, что Вы наследовались a std::ist<PCB>
. Я должен сказать: наследование для многократного использования функциональности не часто получалось хорошо для меня. Но так как Вы также 'наследовали' проект, нет ничего особенного для делания с этим...
Если Вы получающий "итератор списка, несовместимый", это, вероятно, потому что в Вашем "ReadyQueue:: getInstance ()-> добавляют (*iter)"; Вы изменяете что-то в *проход, который делает хеш-алгоритм, возвращает другое значение для стирания, чем это сделало во время вставки.
Я могу предложить более простой алгоритм?
Бесплатная функция std::remove_if
может использоваться для разделения списка в 2, элементы, которые соответствуют или не соответствуют предикату (т.е. arrivalTime == 0). Это возвращает итератор, разделяющий диапазоны. Можно затем звонить ReadyQueue::getInstance()->add(subrange_begin, subrange_end)
(у Вас действительно есть та перегрузка, правильно?) и стирание поддиапазон впоследствии.
Просто случай, где можно использовать алгоритмы STL вместо того, чтобы писать собственные циклы.