使用位表示自定义实现bool向量 - 如何实现operator []

时间:2015-09-19 21:02:35

标签: c++

免责声明 - 这是一项学校作业,但我希望这个问题仍然很有意思!

我实现了一个名为Vector<bool>的自定义类,它将bool条目存储为数字数组中的位。

除了实现这一点外,一切都很顺利:

bool& operator[](std::size_t index) {
    validate_bounds(index);
    ???
}

const实现非常简单,只需读出值即可。然而,我无法理解该怎么做,而且该课程是关于C ++的专业课程,因此我猜测我应该做一些类型deffing或其他什么。数据由unsigned int类型的数组表示,并且应该是动态的(例如push_back(bool value)应该实现)。

1 个答案:

答案 0 :(得分:1)

我解决了这个实现代理类:

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]);
}

如果有人发现任何问题或改进,请发表评论,谢谢!