C ++ 11中有一种有效的方法可以使用std::vector
在向量中存储多个数字类型吗?我能找到的大多数也存储字符串而不存储字符串。我只想存储8到32位的有符号和无符号整数。
到目前为止,我遇到了boost::variant
,但这似乎有点矫枉过正。我错过了一个巧妙的技巧吗?或者我应该选择加强?
我想做这样的事情:
std::vector<Numeric> v{(uint16_t) 1, (int32_t)-200};
答案 0 :(得分:5)
不。 C ++中没有通用的数字类型。
首先,要处理您的具体情况:如果您的内存不足,std::vector<std::int64_t>
将很乐意保护您的所有数据并且速度非常快。你不太可能需要其他任何东西。
否则:
如果您需要速度(即在通用解决方案证明速度变慢之后),请选择能够满足您需要的单一类型。
如果速度不重要(即你无法证明任何明显的劣势),boost.variant
和boost.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
添加一堆构造函数和其他帮助函数。