【问题标题】:How to create certain elemental array from a pre-defined array如何从预定义的数组创建某些元素数组
【发布时间】:2019-03-20 13:23:12
【问题描述】:

如何创建一个数组,以便我可以访问元素 a[1000000]a[1]a[2],甚至不使用 1000000 的大小?

如果可能,请在C++ 中提供答案。

【问题讨论】:

  • 这叫稀疏数组,STL没有实现。所以要么自己做,要么找一个图书馆。或者也许你实际上并不需要它,因为哈希映射可以以同样的方式使用。
  • 为什么?你想做什么?您是在填充其他元素,还是只是某种练习?
  • 看到我有一个长度为 N 的数组,我想计算其中每个元素的频率,其中 N
  • 如果您想建立频率关联,一张地图(无论是否有序)可能会准确地为您提供所需的内容。如果您还需要对关联进行排序(即在构建地图之后,您希望显示前 10 个最频繁的),则需要进行部分排序,但标准库也有相应的例程。
  • @SahilSilare 如果代码是count[arr[i]]++,那么数组count[]每个 元素都需要一个初始值——比如0。所以在任何递增 之前整个数组被初始化/分配和访问。代替数组,代码可以使用unsigned *count = calloc(1000000, sizeof *count); 并查看Why is malloc not “using up” the memory on my computer? 来“节省”内存。使用指向内存的指针比使用数组好吗?

标签: c++ c memory memory-management


【解决方案1】:

使用std::unordered_map<>

enum { N = 9 };
int arr[N] = { 0 };
std::unordered_map<int, int> m;
for (int i = 0; i < N; i++)
{
    ++m[arr[i]];
}

【讨论】:

  • 如果我有 10E5 个不同的元素,你会像这样分配每个元素吗?
  • 如果要分配 100000 个元素,请分配 100000 个元素。
  • @SahilSilare 与您为常规数组提供的语法和用法完全相同。 operator[] 的重点是提供密钥访问权限。这可能会给您带来最大的收益。如果您需要有序枚举,则可以使用常规的map。它非常依赖于使用情况,因此请查看您正在解决的问题并做出相应选择。
猜你喜欢
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 2023-04-07
  • 2022-01-01
  • 2011-09-01
相关资源
最近更新 更多