C ++ 11中多种数字类型的向量

时间:2016-05-21 22:41:06

标签: c++ c++11 boost vector

C ++ 11中有一种有效的方法可以使用std::vector在向量中存储多个数字类型吗?我能找到的大多数也存储字符串而不存储字符串。我只想存储8到32位的有符号和无符号整数。

到目前为止,我遇到了boost::variant,但这似乎有点矫枉过正。我错过了一个巧妙的技巧吗?或者我应该选择加强?

我想做这样的事情:

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

3 个答案:

答案 0 :(得分:5)

不。 C ++中没有通用的数字类型。

首先,要处理您的具体情况:如果您的内存不足,std::vector<std::int64_t>将很乐意保护您的所有数据并且速度非常快。你不太可能需要其他任何东西。

否则:

如果您需要速度(即在通用解决方案证明速度变慢之后),请选择能够满足您需要的单一类型。

如果速度不重要(即你无法证明任何明显的劣势),boost.variantboost.any等通用解决方案将为您提供良好的服务。

答案 1 :(得分:3)

C ++中动态大小的容器是同构的,这意味着它们中的所有元素必须是相同的类型。如果要在这样的容器中模拟不同类型元素的存储,那么您将不得不使用某种类型的标记联合。如上所述,Boost.Variant是一种选择。

另一方面,如果您不需要动态调整容器大小,则可以使用异构容器,如std::tuple或boost :: tuple。

答案 2 :(得分: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添加一堆构造函数和其他帮助函数。