Мне нужно сохранить набор целых и двойных чисел (представляющих номинальные и реальные данные) в С++. Очевидно, я мог бы хранить их все в std::vector<double>
, но это кажется немного неправильным и не дает бонусных баллов за эстетику.
Я также мог бы придумать что-то на основе полиморфизма, но мне также нужно, чтобы коллекция была действительно эффективной: и хранение, и извлечение данных в коллекции должны быть максимально быстрыми. Мне трудно судить, будет ли такое решение максимально эффективным.
Я также нашел boost::variant, который может помочь здесь.
Дополнительная информация: количество элементов в коллекции будет небольшим (‹100) и известно при инициализации коллекции.
Подводя итог: я, очевидно, мог бы решить эту проблему бесчисленным количеством способов, но я не уверен, что было бы хорошим решением, когда (i) действительно важна эффективность и (ii) я также хочу написать несколько приятный код. Каков мой лучший выбор здесь?
Изменить, дополнительная информация. Коллекция представляет собой «строку» в большом наборе данных, ее элементы представляют значения определенных «столбцов». Свойства строк известны, поэтому известно, какие данные хранятся в какой позиции. «Эффективность», о которой я говорю, — это в первую очередь эффективность извлечения значения int/double определенного столбца, хотя быстрая установка значений также важна. У меня есть несколько функций, которые работают с данными, которым необходимо получить их как можно быстрее. Пример:
typedef std::vector<double> Row;
void doubleFun(Row const &row)
{
// Function knows there's always a double at index 0
double value = row[0];
...
}
void integerFun(Row const &row)
{
// Function knows there's always an integer at index 1
int value = row[1];
...
}
После некоторых размышлений и прочтения предложений кажется, что простое хранение столбцов int и double в двух отдельных векторах является надежным решением. Тогда коллекция Row
может просто определить два разных члена для получения номинальных и реальных данных, которые могут использовать функции.
Я думаю, просто хранить как vector<double>
тоже нормально, но это зависит от того, насколько быстро происходит преобразование между double и int (что, вероятно, довольно впечатляет).
Извините за то, что сначала было немного неясно, я надеюсь, что теперь это станет яснее, и я смогу получить больше мыслей по этому вопросу.