Итератор берет элементы непоследовательно
От: Ivan093 Россия  
Дата: 14.10.11 14:04
Оценка:
Доброго времени суток всем!

Есть простенький класс MyClass, наследуемый от std::vector<MyStruct>, в него только добавлены новые методы, а старые не переопределены.
Этот класс-вектор заполняется последовательно значениями.
Далее в коде есть конструкция:
std::vector<MyStruct*>::iterator it=CurrentRow; //Указатель на текущий элемент класса
while(it != MyClass->end()) {

it++
}

Дак вот в этом цикле в некотором случае (этот код повторяется многократно) итератор возвращает элементы не последовательно (не так как они добавлялись), а берет несколько элементов назад, это даже по адресу памяти видно, далее же идет по порядку.
Где ошибка? Понять не могу почему так...
Re: Итератор берет элементы непоследовательно
От: watch-maker  
Дата: 14.10.11 14:47
Оценка: +1
Здравствуйте, Ivan093, Вы писали:

I>Этот класс-вектор заполняется последовательно значениями.

I>Далее в коде есть конструкция:
I>std::vector<MyStruct*>::iterator it=CurrentRow; //Указатель на текущий элемент класса

Что за CurrentRow и как оно получается? Ошибка, например, может заключаться в том, что вектор рос после сохранения CurrentRow.
Re: Итератор берет элементы непоследовательно
От: LaptevVV Россия  
Дата: 14.10.11 14:57
Оценка:
Здравствуйте, 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*> — это опечатка?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Итератор берет элементы непоследовательно
От: Ivan093 Россия  
Дата: 15.10.11 05:04
Оценка:
Здравствуйте, watch-maker, Вы писали:

WM>Здравствуйте, Ivan093, Вы писали:


I>>Этот класс-вектор заполняется последовательно значениями.

I>>Далее в коде есть конструкция:
I>>std::vector<MyStruct*>::iterator it=CurrentRow; //Указатель на текущий элемент класса

WM>Что за CurrentRow и как оно получается? Ошибка, например, может заключаться в том, что вектор рос после сохранения CurrentRow.


CurrentRow это std::vector<MyStruct*>::iterator, указывает на элемент вектора. Алгоритм такой, что перебирается другой массив поэлементно и для некоторых элементов идет перебор вектора начиная с CurrentRow на несколько позиций вперед, и если выполняется нужное условие, то указатель CurrentRow устанавливается на нужный элемент вектора. Т.е. цикл в цикле, а работа с итератором -- это внутренний цикл.
Во время работы циклов вектор не изменяется по размеру, а только заполняются некоторые поля структур элементов вектора.
Re: Итератор берет элементы непоследовательно
От: Caracrist https://1pwd.org/
Дата: 16.10.11 09:25
Оценка:
Здравствуйте, 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>Где ошибка? Понять не могу почему так...

В приведённом коде проблемы не обнаруженно, давай ещё код...
~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: Итератор берет элементы непоследовательно
От: Ivan093 Россия  
Дата: 18.10.11 05:50
Оценка:
Здравствуйте, Caracrist, Вы писали:

Код большой, я проверил -- в нем нигде вектор не изменяется по размеру.
Перед глючным кодом вставил для отладки код:
while(itrow != MyClass->end()) {
MyStruct *PlanRow = *itrow;
OutputDebugString(IntToStr(PlanRow->RowId).c_str());
itrow++;
}

Строки выдаются в том порядке, в котором заполнялся вектор. А вот итератор берет их не последовательно...

C>В приведённом коде проблемы не обнаруженно, давай ещё код...
Re[3]: Итератор берет элементы непоследовательно
От: Ivan093 Россия  
Дата: 18.10.11 06:31
Оценка:
Нашел ошибку, кривые мои руки!
Был код, который выполнялся не всегда:
*CurrentPlanRow = PlanRow;
где:
std::vector<MyStruct*>::iterator CurrentRow
MyStruct *PlanRow

Всем спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.