Russian Qt Forum
Май 17, 2024, 22:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Массивы пар  (Прочитано 3907 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Октябрь 24, 2015, 15:48 »

Добрый день

Жил-был незатейливый вектор, но вот в один прекрасный день оказалось что разные эл-ты должны обрабатываться по разному. Поэтому добавилось такое
Код
C++ (Qt)
std::vector<CData> data;  // сами данные
 
typedef std::pair<int, int> TPair;
typedef std::vector<TPair> TPairVec;
typedef std::vector<TPairVec> TVec;
 
TVec dataRange;
Пример
Цитировать
dataRange[0] = { { 0, 1}, {10, 15}, { 98, 100 } }
Эл-ты с индексами (0, 10, 11, 12, 13, 14, 98, 99) входят в первый набор, др элементы в другие, пересечений этих множеств нет.

И вот хочется сделать элегантный итератор (или что-то в этом роде) чтобы удобно пробегаться по заданному набору. При этом учитывая что возможен вариант dataRange.size() == 0, т.е. никаких наборов/разбивки вообще нет, используется просто data (хоть for'ом). То же самое если разбивка есть, но по каким-то причинам игнорируется.

Прошу блеснуть техникой  Улыбающийся

Спасибо
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Октябрь 24, 2015, 16:39 »

А какая взаимосвязь между data и dataRange ?
По каким данным надо итерировать?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 25, 2015, 08:05 »

А какая взаимосвязь между data и dataRange ?
По каким данным надо итерировать?
Для примера вверху: допустим какой-то обработчик захотел работать с "набором 0". Тогда итератор должен ему последовательно выдавать ссылки на эл-ты data с индексами  (0, 10, 11, 12, 13, 14, 98, 99). 
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Октябрь 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 - перескакиваем на следующий и т.д.
« Последнее редактирование: Октябрь 29, 2015, 12:19 от Racheengel » Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.191 секунд. Запросов: 22.