- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
vector<int> :: iterator itBegins = array.begin();
vector<int> :: iterator itEnds = array.end();
while(itBegins != itEnds)
{
pVec.pop_back();
it++;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+69.8
vector<int> :: iterator itBegins = array.begin();
vector<int> :: iterator itEnds = array.end();
while(itBegins != itEnds)
{
pVec.pop_back();
it++;
}
Сей артефакт остался в коде ввиду лености переписывать его в 100 файлах сразу после удаления того, ради чего собственно затевался while(!pVec.empty()) ... прямо скажем - отлов ЭТОГО занял немало времени и нервов... тк на первый взгляд оно должно... а что ты видишь в этом коде, %юзернейм% ?
(исправленная версия XD )
guest 03.11.2009 01:33 # −4
guest 03.11.2009 16:02 # 0
generalgda 03.11.2009 03:48 # 0
interested 03.11.2009 08:22 # +1
И ещё тут написано, что выбивают элемент из pVec, а итераторы на какой-то array...
vector сложный контейнер, думаю он легко отследит, что pop_back выполняется на пустом векторе, и просто будет в цикле крутиться до морковкиного заговенья.
generalgda 03.11.2009 08:25 # 0
:)))
interested 03.11.2009 08:36 # 0
"Ну ничего. Я готов ждать Сяо-Феня хоть до морковкина заговенья" (с) =]
g26g 03.11.2009 10:14 # 0
interested 03.11.2009 10:53 # 0
Просто, стандарт предоставляет относительную "вольность". Например стандарт не определяет размер буфера для vector и даже не определяет, что этот буфер должен быть. А valarray может предполагать, что объект, в нём лежащий, всегда можно побитово скопировать. Но если valarray поддерживает глубокое копирование и не только POD объекты, то это не делает stl не стандартной.
interested 03.11.2009 10:54 # 0
interested 03.11.2009 16:32 # 0
Я, пока лазил и искал что-то по vector.clear(), нашёл, что pop_back() ничего никому не обязан... И на пустом векторе может произойти что угодно... Так что крутилка эта может иметь ещё и последствия...
xaionaro 03.11.2009 10:31 # 0
Тем более на Ваш случай можно воспользоваться, к примеру, sed-ом :)
Zeks 03.11.2009 17:14 # 0
Про sed знаю - этот кусок кода активно генерится с помощью него в том числе, но это надо было выгружаться в линукс тк програмлю я на работе под виндой... :) Вот в результате лености лишний раз перезагрузиться и применения "Заменить в файлах" вместо требовавшегося перегенерирования cpp`шников и появился сей артефакт)
interested 03.11.2009 18:06 # 0
И действительно по идее всё удаляется.
Мы же не разименовываем итераторы, потому указывающие не известно куда итераторы, которые, вероятно, нигде больше не используются, не страшны.
Zeks 03.11.2009 18:10 # 0
Zeks 03.11.2009 18:11 # 0
interested 03.11.2009 18:20 # 0
После pVec.pop_back() a.end() не равняется itEnds. Это и называется invalidate iterators.
>я боюсь что я сам запутался
Именно по этому не стоит забивать себе голову итераторами, когда можно проще. =]
interested 03.11.2009 18:26 # 0
guest 08.11.2009 05:10 # 0
Zeks 03.11.2009 17:16 # 0