在c ++中,我试图创建一个数组来存储两种不同的数据类型。基本上,我想要一个ID和实际的数据类型。
伪码:
array[int][myObj]
0, myObj1
1, myObj2
2, myObj3
我明白这不是如何声明一个数组。这个功能可以吗?我是否必须使用结构创建自定义类?
答案 0 :(得分:5)
这取决于您想要如何使用它。有许多选项都具有有效的用例:
一个简单的myObj数组:myObj array[]
。这与您给出的示例匹配,因为对象的关联ID只是数组中该对象的索引。第一个元素有ID 0,第二个元素有ID 1等。但是,为了灵活性和良好的C ++风格,你应该真正使用std::vector
或std::array
。
如果要将每个对象与固定ID相关联,而不管其在数组中的位置(也可能在其他位置)。您可以使用std::pair<int, myObj>
将整数与对象的实例配对。你可以像这样使用它:
std::vector<std::pair<int, myObj>> v;
v.push_back(std::make_pair(0, myObj1));
与此类似的替代方法是将ID封装在myObj类中。但是,在某些情况下这可能不合适(ID实际上不是myObj的一部分,单独的ID可能随时用于同一个对象)。
如果您需要能够通过其ID访问数组中的元素,则需要std::map<int, myObj>
。这会将整数ID映射到myObj的实例。像这样使用它:
std::map<int, myObj> m;
m.insert(std::make_pair(0, myObj1));
现在您可以使用m[0]
来访问元素。如果您想加快访问时间并且不关心订购的元素,可以使用std::unordered_map
代替
答案 1 :(得分:0)
在C ++中,数组的所有成员都是相同的类型,而多维数组实际上是作为一维数组实现的。
如果你只想要一个包含两种不同类型行的数组,我建议:
std::vector<std::pair<int, MyObj> > vec;
或者:
std::pair<int, MyObj> arr[200]; // generally always prefer std::vector over array, but this is possible
如果你想基于int查找MyObj对象,那么std :: map或std :: multimap就是你的选择。