相关疑难解决方法(0)

在 set<int>、vector<bool> 与 vector<boolean_t> 之间进行选择以用作位图(位集/位数组)

给定一系列索引(标识符),我想将每个索引映射到一个布尔值,即:

// interface pseudocode
interface bitmap {
  bool identifier_is_set(unsigned int id_idx) const;
  void set_identifier(unsigned int id_idx, bool val) const;
};
Run Code Online (Sandbox Code Playgroud)

这样我就可以设置和查询每个ID(索引)(如果设置或未设置),您更喜欢用什么来实现这个?

我认为这称为位数组或位图或位集,如果我错了,请纠正我。

假设最大标识符是预定的并且不大于1e6(1m),可能小得多(10k - 100k)。(这意味着 sizeof(int)*maximum_id_idx 使用的大小很容易适合内存。)

到目前为止我看到的可能的解决方案:

  • std::set<size_t>- 根据需要向该集合中添加或删除标识符。只要我们有稀疏位图,就允许任意大的标识符。
  • std::vector<bool>- 调整为适当的最大值,为每个 id_idx 存储 true 或 false。
  • std::vector<char>- 同样的事情,但没有遇到奇怪的std::vector<bool>问题。使用的内存比vector<int>.
  • std::vector<int>- 使用 anint作为布尔标志来拥有使用机器自然字大小的容器。(不知道这是否会有所作为。)

请回答您更喜欢哪种容器类型以及原因,考虑到上面引用的最大 id 限制,特别是考虑查询位图的性能方面(插入性能并不重要)。

vector注意: vs.的接口使用set并不重要,因为无论如何它都会隐藏在它的包装类后面。

编辑:添加关于 std::bitset 的讨论:std::bitset 会将整个数组大小合并到对象中,即 sizeof(std::bitset<1m>) 的大小约为 1/8 MB ,这会产生一个巨大的单个对象,并且会产生一些您无法再放入堆栈中的东西(这可能相关,也可能不相关)。

c++ performance

5
推荐指数
1
解决办法
6131
查看次数

标签 统计

c++ ×1

performance ×1