2

在 C++ 中,我试图创建一个数组来存储两种不同的数据类型。本质上,我想要一个 ID 和实际的数据类型。

伪代码:

array[int][myObj]

0, myObj1
1, myObj2
2, myObj3

我明白这不是如何声明一个数组。这个功能可以吗?我是否必须使用结构创建自定义类?

4

2 回答 2

5

这取决于你想如何使用它。有许多选项都有有效的用例:

  1. 一个简单的 myObj: 数组myObj array[]。这与您给出的示例相匹配,因为对象的关联 ID 只是该对象在数组中的索引。第一个元素的 ID 为 0,第二个元素的 ID 为 1,依此类推。但是,为了灵活性和良好的 C++ 风格,您应该使用std::vectoror std::array

  2. 如果您想将每个对象与固定 ID 相关联,无论其在数组中的位置如何(也可能在其他位置)。您可以使用 astd::pair<int, myObj>将整数与对象的实例配对。你会像这样使用它:

    std::vector<std::pair<int, myObj>> v;
    v.push_back(std::make_pair(0, myObj1));
    

    对此类似的替代方法是将 ID 封装在 myObj 类中。但是,这在某些情况下可能不合适(ID 实际上不是 myObj 的一部分,不同的 ID 可以随时用于同一对象)。

  3. 如果您需要能够通过其 ID 访问数组中的元素,您需要一个std::map<int, myObj>. 这会将整数 ID 映射到 myObj 的实例。像这样使用它:

    std::map<int, myObj> m;
    m.insert(std::make_pair(0, myObj1));
    

    现在您可以使用例如m[0]. 如果您想加快访问时间并且不关心被订购的元素,您可以使用 astd::unordered_map代替

于 2012-10-04T16:41:44.187 回答
1

在 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 。

于 2012-10-04T16:27:06.667 回答