【发布时间】:2019-09-28 12:52:32
【问题描述】:
API 不允许对不同大小的 dynamic_bitsets 应用逻辑操作,而我的应用程序要求如果其中一个位集大于另一个,则相应地调整结果大小。 我必须创建一个临时副本来解决这个问题:
using column_mask = boost::dynamic_bitset<uint64_t>;
void column_mask_union(column_mask& to, const column_mask& with) {
if (to.size() > with.size()) {
if (with.size()) {
column_mask tmp = with;
tmp.resize(to.size());
to |= tmp;
}
return;
}
if (to.size() < with.size()) {
to.resize(with.size());
}
to |= with;
}
我可以在 API 中看到函数 to_block_range() 和 from_block_range() 理论上可以用来访问位集, 但它们似乎过于有限,无法实现不同大小的位集的逻辑 OR。
【问题讨论】:
-
不复制是不是很重要?您基本上需要一个范围或视图(非拥有位集)来引用现有位集的一部分。如果没有这样的类,那么这个类的函数(如果存在的话)无论如何都会返回一个副本。
-
如果 with 小于 to,有一个简单的算法可以迭代 'with' 块和二进制或它们与 'to' 块。我只需要访问块上的迭代器。
标签: c++ boost boost-dynamic-bitset