В моем текущем проекте я имею дело с многомерной структурой данных. Базовый файл хранится последовательно (т. Е. Один массивный массив, вектор векторов нет). Алгоритмы, использующие эти структуры данных, должны знать размер отдельных измерений.Универсальные многомерные итераторы C++
Мне интересно, был ли определен многомерный класс итератора где-то в общем виде, и если есть какие-либо стандарты или предпочтительные способы решения этой проблемы.
В настоящее время я просто использую линейный итератор с некоторыми дополнительными методами, которые возвращают размер каждого измерения и сколько измерений есть в первой части. Причина, по которой мне это не нравится, заключается в том, что я не могу использовать std :: distance разумным способом (например, только возвращает расстояние всей структуры, но не для каждого измерения отдельно).
По большей части я получаю доступ к структуре данных линейным способом (первое измерение начинается до конца -> следующее измерение + ... и т. Д.), Но было бы полезно знать, когда одно измерение «заканчивается». Я не знаю, как это сделать с помощью оператора *(), оператора +() и оператора ==() в таком подходе.
Недопустимый подход вектора векторов, потому что я не хочу разделить файл. Также алгоритмы должны работать с структурой с разной размерностью и поэтому трудно обобщить (или, может быть, есть способ?).
Boost multi_array имеет те же проблемы (несколько «уровней» итераторов).
Надеюсь, это не слишком расплывчато или абстрактно. Любой намек в правильном направлении был бы оценен.
Я искал решение самостоятельно и снова увеличил boost :: multi_array. Как оказалось, можно генерировать подвыборы для данных с ними, но в то же время также взять прямой итератор на верхнем уровне и неявно «сгладить» структуру данных. Однако реализованные версии multi_array не соответствуют моим потребностям, поэтому я, вероятно, сам реализую один (который обрабатывает кеширование файлов в фоновом режиме), который совместим с другими multi_arrays.
Я буду обновлять его снова после выполнения.
Похоже, вам нужно реализовать многомерный итератор самостоятельно. Просто не ограничивайте себя операторами: вы можете использовать именованные методы для запроса информации о текущей позиции в каждом измерении. –
Этот вопрос интересен. Единственный способ, которым я нашел, чтобы предоставить такую информацию, - это методы, которые могут выводить мультииндекс, например. '{x, y, z}' из индекса сглаживания (и наоборот). Я не понимаю, как вы можете сделать это стандартным способом, не предоставляя для этого свой собственный пользовательский класс. – coincoin
Спасибо за быстрый ответ. @SergeRogatch: То, что я тоже подумал, но кажется таким «анти-идиоматическим». – Lazarus535