2016-05-21 4 views
1

Есть ли эффективный способ в C++ 11 для хранения нескольких цифровых типов в векторе с использованием std::vector? Большинство, что я могу найти, также хранят строки, а что нет. Я просто хочу хранить целые числа, подписанные и без знака, от 8 до 32 бит.Вектор нескольких числовых типов в C++ 11

До сих пор я сталкивался с boost::variant, но это кажется немного излишним. Есть ли уловка, которую я упускаю? Или мне нужно идти с усилением?

Я хочу сделать что-то вроде этого:

std::vector<Numeric> v{(uint16_t) 1, (int32_t)-200};

+0

Что вы будете делать с вектором, если у вас есть это? –

+1

Вы можете попытаться использовать 'std :: vector ' – saloomi2012

+2

Зачем нужно: boost :: variant be overkill? – rwols

ответ

5

Nope. В C++ нет общего числового типа.

Во-первых, для обработки вашего конкретного случая: если у вас не хватает памяти, std::vector<std::int64_t> с радостью сохранит все ваши данные и будет очень быстро. Маловероятно, что вам нужно что-нибудь еще.

В противном случае:

Если вам нужна скорость (то есть после того, как родовое решения Доказательства медленно), соглашайтесь одного типа, который делает то, что вам нужно, а также возможно.

Если скорость не так важна (т. Е. Вы не можете доказать какой-либо существенный недостаток), общие решения, такие как boost.variant и boost.any, послужат вам хорошо.

3

Динамически размера контейнеров в C++ являются однородными, а это означает, что все элементы в них должны быть одного и того же типа. Если вы хотите эмулировать хранение элементов разных типов в таком контейнере, тогда вам придется использовать какой-либо меченый союз. Boost.Variant, как уже упоминалось, является одним из вариантов.

С другой стороны, если вы не нуждаетесь в динамическом изменении размера контейнера, вы можете использовать гетерогенный контейнер, например std::tuple или boost :: tuple.

2

Вы сказали:

Я просто хочу, чтобы хранить подписанные и целые числа без знака в диапазоне от 8 до 32 бит.

Вы можете использовать std::vector<int64_t> для хранения любого числа в этом диапазоне. Однако, если вам нужно знать размер/тип элементов vector, вам нужно будет хранить дополнительную информацию.

Вы можете использовать struct что-то вроде:

struct MyNumber 
{ 
    enum Type {INT8, UINT8, INT16, UINT16, INT32, UINT32}; 
    type type; 
    uint64_t value;   
}; 

Затем используйте std::vector<MyNumber>.

Чтобы сделать преобразования с MyNumber, вам необходимо добавить кучу конструкторов и других вспомогательных функций в MyNumber.