Название: Массивы пар Отправлено: Igors от Октябрь 24, 2015, 15:48 Добрый день
Жил-был незатейливый вектор, но вот в один прекрасный день оказалось что разные эл-ты должны обрабатываться по разному. Поэтому добавилось такое Код Пример Цитировать dataRange[0] = { { 0, 1}, {10, 15}, { 98, 100 } } Эл-ты с индексами (0, 10, 11, 12, 13, 14, 98, 99) входят в первый набор, др элементы в другие, пересечений этих множеств нет.И вот хочется сделать элегантный итератор (или что-то в этом роде) чтобы удобно пробегаться по заданному набору. При этом учитывая что возможен вариант dataRange.size() == 0, т.е. никаких наборов/разбивки вообще нет, используется просто data (хоть for'ом). То же самое если разбивка есть, но по каким-то причинам игнорируется. Прошу блеснуть техникой :) Спасибо Название: Re: Массивы пар Отправлено: Racheengel от Октябрь 24, 2015, 16:39 А какая взаимосвязь между data и dataRange ?
По каким данным надо итерировать? Название: Re: Массивы пар Отправлено: Igors от Октябрь 25, 2015, 08:05 А какая взаимосвязь между data и dataRange ? Для примера вверху: допустим какой-то обработчик захотел работать с "набором 0". Тогда итератор должен ему последовательно выдавать ссылки на эл-ты data с индексами (0, 10, 11, 12, 13, 14, 98, 99). По каким данным надо итерировать? Название: Re: Массивы пар Отправлено: Racheengel от Октябрь 29, 2015, 12:17 Ну, код писать целиком влом :) Но я бы сделал так:
- создал класс вроде CMyInterator с конструктором CMyInterator(const std::vector<CData>& data, const* TVec dataRangePtr = NULL); - в нем бы сделал метод типа CData& next(), который бы возвращал ссылку на след. элемент, либо data.end() если усе; - внутри этого метода завел бы 2 внутренних индекса: первый по data, второй по dataRangePtr. Если dataRangePtr == NULL или пустое, то каждый next() инкрементирует первый индекс, возвращая ссылку на data[i1++] либо data.end(), если прошли весь массив. Если range не пустое, то идем по текущему range и возвращаем ссылки на соответствующий с. Достигли конца range - перескакиваем на следующий и т.д. |