Мне нужно сохранить коллекцию int и double (представляющую номинальные и реальные значения) в C++. Я мог бы, очевидно, сохранить их все в std::vector<double>
, но это кажется немного неправильным и не получает бонусных баллов за эстетику.Самый эффективный способ хранения смешанной коллекции удвоений и ints
Я мог бы также приготовить что-то на основе полиморфизма, но мне также нужна коллекция, чтобы быть действительно эффективной: как хранение, так и извлечение данных в коллекции должны быть как можно быстрее. Мне трудно судить, будет ли такое решение максимально эффективным.
Я также нашел 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 столбцов и двойных столбцов в двух отдельных векторов представляет собой твердый раствор. Коллекция могла бы просто определить два разных члена для получения номинальных и реальных данных, которые могут использовать функции.
Просто хранить как vector<double>
тоже нормально, но это зависит от того, насколько быстро происходит преобразование между двойным и int (что, вероятно, довольно впечатляет).
Извините за то, что сначала я немного неясен, я надеюсь, что это яснее, и теперь я могу получить еще несколько соображений по этому вопросу.
Вы не предоставили нам достаточно информации, чтобы узнать лучшее решение - Каковы свойства коллекции? Разрешены ли дубликаты? Важен порядок? Должен ли он сортироваться? Требуется ли сохранить тип данных, или он действителен для вставки 10.0 (double) и извлечения 10 (int)? – Tom
Также, какой показатель эффективности вы пытаетесь оптимизировать? Общая площадь? Время вставки? Случайное время доступа к поиску? Время итерации? – Tom
Обновлено с дополнительной информацией, извините за то, что вы не слишком поняли вначале. Надеюсь, теперь это лучше. –