自定义实现具有位表示的bool向量-如何实现运算符[]
Custom implementation of a bool vector with bit representation - how to implement operator[]
免责声明-这是学校的作业,但问题仍然是有趣的我希望!
我已经实现了一个名为Vector<bool>
的自定义类,它将bool
项存储为数字数组中的位。
一切都很好,除了实现这个:
bool& operator[](std::size_t index) {
validate_bounds(index);
???
}
const
的实现非常直接,只是读取值。然而,在这里,我真的不知道该怎么做,这门课是关于c++的专业课程,所以我猜我应该做一些类型定义之类的。数据由unsigned int
类型的数组表示,并且应该是动态的(例如,应该实现push_back(bool value)
)。
我实现了一个代理类来解决这个问题:
class BoolVectorProxy {
public:
explicit BoolVectorProxy(unsigned int& reference, unsigned char index) {
this->reference = &reference;
this->index = index;
}
void operator=(const bool v) {
if (v) *reference |= 1 << index;
else *reference &= ~(1 << index);
}
operator bool() const {
return (*reference >> index) & 1;
}
private:
unsigned int* reference;
unsigned char index;
};
在主类内部:
BoolVectorProxy operator[](std::size_t index) {
validate_bound(index);
return BoolVectorProxy(array[index / BLOCK_CAPACITY], index % BLOCK_CAPACITY);
}
我还使用Catch作为测试库,代码通过了这个测试:
TEST_CASE("access and assignment with brackets", "[Vector]") {
Vector<bool> a(10);
a[0] = true;
a[0] = false;
REQUIRE(!a[0]);
a[1] = true;
REQUIRE(a[1]);
const Vector<bool> &b = a;
REQUIRE(!b[0]);
REQUIRE(b[1]);
a[0] = true;
REQUIRE(a[0]);
REQUIRE(b[0]);
REQUIRE(b.size() == 10);
REQUIRE_THROWS(a[-1]);
REQUIRE_THROWS(a[10]);
REQUIRE_THROWS(b[-1]);
REQUIRE_THROWS(b[10]);
}
如果任何人发现任何问题或改进可以作出,请评论,谢谢!
基本上实现operator[]与实现const operator[]是一样的,只是一个是可写的(左值),另一个是只读的(右值)。
我想你已经理解了这个问题:你可以使用位操作将无符号整型转换为bool型,你也可以说"如果第n个bool在X中被修改,对X进行位操作,它就完成了!"。但是这个操作符意味着:我想要bool值的左值,这样我就可以随时修改它,并对相关的整数产生影响。这意味着您需要一个bool类型的引用,或者在您的例子中需要一个单个位的引用,因此您可以动态地修改该位。不幸的是,您不能引用单个位,您可以引用的最小值是整个字节(使用char
),因此您必须随身携带至少7个其他布尔值的块。那不是你想要的。
话虽这么说,我明白这可能是为了你的任务,但将bool转换为多个unsigned int对我来说更像是无用的C优化。您最好使用单个bool数组(c风格),并手动执行内存处理,因为这几乎就是您正在做的事情。此外,使用该方法,您实际上可以引用单个布尔值(并能够修改它),而无需触及其他布尔值。
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 如何实现内部实现依赖于模板参数的类
- 我的 PRNG 实现与我尝试复制的实现有何不同?