c ++中动态的索引结构数组

时间:2017-01-30 14:29:15

标签: c++ arrays struct

如何使用不连续的键在c ++中创建动态的结构数组?

我有这样的结构:

struct Data {
   int name;
   int val;
}

我正在从可变长度的文件中读取names

我们说它是:

1 2
3 5
7 12

最后我想要一个由name索引的(动态)数组, 像这样(伪代码):

arr[1] = *Data(1,2)
arr[3] = *Data(3,5)
arr[7] = *Data(7,12)

预期结果:

cout << arr[7]->val    // outputs 12
cout << arr[3]->val    // outputs 5

// array size = 3

如何用c ++写这个?
(假设只有基本特征,没有矢量,地图等)。

到目前为止,我尝试过这样的事情:

Data *distances = new Data[15];     // explicit size works
// Data *distances = new Data;       // this don't
distances[5] = myDataStruct;

2 个答案:

答案 0 :(得分:1)

这为只有一个Data元素分配内存。

Data *distances = new Data;

这为15个Data元素分配内存。

Data *distances = new Data[15];

要得到你想要的东西,你可以

  1. 分配最大数量的元素并始终保持在此边界或
  2. 分配一些元素,并为每个新元素调整数组大小(C样式malloc / realloc / free或C ++样式new / delete,但是为了调整大小,你需要并分配一个新数组并复制旧值)或
  3. 提供一个内部存储所有元素列表并导出operator[]的类,该类不执行数组查找,但列表中的查找

答案 1 :(得分:0)

Naïve实现(这不支持在数组中添加新元素,只支持从现有元素中查找。我将完整的实现作为练习留给读者):

struct associative {
    Data* data_arr;
    Data* end;

    Data* operator[](int i) {
        return linear_search(data_arr, end, i);
    }
};

您可以使用std::find(使用自定义谓词)代替linear_search,但如果您的定义中没有包含在“基本功能”中,那么您可以我只需要重新实现它。线性搜索并不难实现。

这种天真的数据结构可以改进的方式很少:

  • RAII对指向内存的所有权将使数据结构更安全。
  • 支持将新元素添加到内部数组
  • 更好的数据结构而不是数组:二进制搜索树或哈希映射允许渐近更快的查找。
  • 您现在正在重新实施std::map或无序变体。考虑不要重新发明轮子。