自定义实现具有位表示的bool向量-如何实现运算符[]

Custom implementation of a bool vector with bit representation - how to implement operator[]

本文关键字:实现 何实现 运算符 向量 表示 自定义 bool      更新时间:2023-10-16

免责声明-这是学校的作业,但问题仍然是有趣的我希望!

我已经实现了一个名为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风格),并手动执行内存处理,因为这几乎就是您正在做的事情。此外,使用该方法,您实际上可以引用单个布尔值(并能够修改它),而无需触及其他布尔值。

是否一定要使用unsigned int数组来赋值?