Есть простенький класс MyClass, наследуемый от std::vector<MyStruct>, в него только добавлены новые методы, а старые не переопределены.
Этот класс-вектор заполняется последовательно значениями.
Далее в коде есть конструкция:
std::vector<MyStruct*>::iterator it=CurrentRow; //Указатель на текущий элемент класса
while(it != MyClass->end()) {
it++
}
Дак вот в этом цикле в некотором случае (этот код повторяется многократно) итератор возвращает элементы не последовательно (не так как они добавлялись), а берет несколько элементов назад, это даже по адресу памяти видно, далее же идет по порядку.
Где ошибка? Понять не могу почему так...
Здравствуйте, Ivan093, Вы писали:
I>Этот класс-вектор заполняется последовательно значениями. I>Далее в коде есть конструкция: I>std::vector<MyStruct*>::iterator it=CurrentRow; //Указатель на текущий элемент класса
Что за CurrentRow и как оно получается? Ошибка, например, может заключаться в том, что вектор рос после сохранения CurrentRow.
Здравствуйте, Ivan093, Вы писали:
I>Доброго времени суток всем!
I>Есть простенький класс MyClass, наследуемый от std::vector<MyStruct>, в него только добавлены новые методы, а старые не переопределены. I>Этот класс-вектор заполняется последовательно значениями. I>Далее в коде есть конструкция: I>std::vector<MyStruct*>::iterator it=CurrentRow; //Указатель на текущий элемент класса I>while(it != MyClass->end()) {
I>it++ I>}
I>Дак вот в этом цикле в некотором случае (этот код повторяется многократно) итератор возвращает элементы не последовательно (не так как они добавлялись), а берет несколько элементов назад, это даже по адресу памяти видно, далее же идет по порядку. I>Где ошибка? Понять не могу почему так...
1. Вместо наследования сделайте композицию.
2. std::vector<MyStruct> и std::vector<MyStruct*> — это опечатка?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, watch-maker, Вы писали:
WM>Здравствуйте, Ivan093, Вы писали:
I>>Этот класс-вектор заполняется последовательно значениями. I>>Далее в коде есть конструкция: I>>std::vector<MyStruct*>::iterator it=CurrentRow; //Указатель на текущий элемент класса
WM>Что за CurrentRow и как оно получается? Ошибка, например, может заключаться в том, что вектор рос после сохранения CurrentRow.
CurrentRow это std::vector<MyStruct*>::iterator, указывает на элемент вектора. Алгоритм такой, что перебирается другой массив поэлементно и для некоторых элементов идет перебор вектора начиная с CurrentRow на несколько позиций вперед, и если выполняется нужное условие, то указатель CurrentRow устанавливается на нужный элемент вектора. Т.е. цикл в цикле, а работа с итератором -- это внутренний цикл.
Во время работы циклов вектор не изменяется по размеру, а только заполняются некоторые поля структур элементов вектора.
Здравствуйте, Ivan093, Вы писали:
I>Доброго времени суток всем!
I>Есть простенький класс MyClass, наследуемый от std::vector<MyStruct>, в него только добавлены новые методы, а старые не переопределены. I>Этот класс-вектор заполняется последовательно значениями. I>Далее в коде есть конструкция: I>std::vector<MyStruct*>::iterator it=CurrentRow; //Указатель на текущий элемент класса I>while(it != MyClass->end()) {
I>it++ I>}
I>Дак вот в этом цикле в некотором случае (этот код повторяется многократно) итератор возвращает элементы не последовательно (не так как они добавлялись), а берет несколько элементов назад, это даже по адресу памяти видно, далее же идет по порядку. I>Где ошибка? Понять не могу почему так...
В приведённом коде проблемы не обнаруженно, давай ещё код...
Код большой, я проверил -- в нем нигде вектор не изменяется по размеру.
Перед глючным кодом вставил для отладки код:
while(itrow != MyClass->end()) {
MyStruct *PlanRow = *itrow;
OutputDebugString(IntToStr(PlanRow->RowId).c_str());
itrow++;
}
Строки выдаются в том порядке, в котором заполнялся вектор. А вот итератор берет их не последовательно...
C>В приведённом коде проблемы не обнаруженно, давай ещё код...