使用哈希表设置执行

我必须在C++中使用哈希表(开放地址和双哈希)实现ADT集,我的itetor有一个问题,它不能通过下一个测试。

void testIterator() {
    cout << "Test iterator" << endl;
    Set s;
    SetIterator it = s.iterator(); //iterator on an empty set
    assert(it.valid() == false);
    try {
        it.next();
        //assert(false);
    }
    catch (exception& e) {
        assert(true);
    }
    try {
        it.getCurrent();
        //assert(false);
    }
    catch (exception& ex) {
        assert(true);
    }
    for (int i = 0; i < 100; i++) {
        s.add(33);
    }
    //printM(m);
    SetIterator it2 = s.iterator();
    assert(it2.valid() == true);
    TElem elem = it2.getCurrent();
    assert(elem == 33);
    it2.next();
    assert(it2.valid() == false);

    it2.first();
    assert(it2.valid() == true);

    Set s2;
    for (int i = -100; i < 100; i++) {
        s2.add(i);
        s2.add(i);
        s2.add(i);
    }
    //printM(m2);
    SetIterator it3 = s2.iterator();
    assert(it3.valid() == true);
    for (int i = 0; i < 200; i++) {
        //TElem e1 = im3.element();
        it3.next();
    }
    assert(it3.valid() == false);
    it3.first();
    assert(it3.valid() == true);


    Set s3;
    for (int i = 0; i < 200; i = i + 4) {
        s3.add(i);
    }
    //printM(m3);

    SetIterator it4 = s3.iterator();
    assert(it4.valid() == true);
    int count = 0;
    while (it4.valid()) {
        TElem e = it4.getCurrent();
        assert(e % 4 == 0);
        it4.next();
        count++;
    }
    try {
        it4.getCurrent();
        //assert(false);
    }
    catch (exception& ex) {
        assert(true);
    }
    try {
        it4.next();
        //assert(false);
    }
    catch (exception& ex) {
        assert(true);
    }
    assert(count == 50);
}

我的itetor有一个问题,它不能通过下一个测试:它不能通过注释资产。我是这样实现这些方法的。

SetIterator::SetIterator(const Set& _set) : set{ _set }
{
    this->pos = 0;
    while (this->set.elems[this->pos] == INT_MIN && this->pos < this->set.m)
        this->pos++;
    this->first_pos = pos;
}

void SetIterator::first()
{
    this->pos = this->first_pos;
}

void SetIterator::next()
{
    this->pos++;

    while (this->set.elems[this->pos] == INT_MIN && this->pos < this->set.m)
        this->pos++;
}

bool SetIterator::valid() const
{
    if (this->pos < this->set.m)
        return true;

    return false;
}

TElem SetIterator::getCurrent() const
{
    return this->set.elems[this->pos];
}

谁能帮帮我,好吗?我不知道为什么会发生这种情况。

解决方案:

我们先确定你理解try-catch。

try {
    // some code
    assert(false);
}
catch (exception& e) {
    assert(true);
}

这是一种说法,”我 期待 一些代码通过抛出异常而失败。” 所以如果它没有抛出异常,我们就通过断言false来标志它。如果它 是否 抛出一个异常,我们抓住它,这样我们的程序就不会崩溃,然后断言真,继续前进。

让我们以第一个测试为例。

给定一个迭代器 it 对于一个空集,测试期望 it.next() 抛出一个异常。然而,正如你所发现的,它并没有。

所以,首先,让我们弄清楚你的代码应该在哪里抛出异常。嗯,很明显,在这里。

void SetIterator::next()
{
    this->pos++;

    while (this->set.elems[this->pos] == INT_MIN && this->pos < this->set.m)
        this->pos++;
}

但是我们怎么知道迭代器是为一个空集建立的?如何将 做?我不知道什么 this->set.m 指的是什么,因为我没有你剩下的代码,但我们可以说它指的是你的集合中的项目数。那么这个数字为零就意味着它是一个空的集合,对吗?那么这样如何?

void SetIterator::next()
{
    if (this->s.m == 0) throw std::runtime_err;

    this->pos++;

    while (this->set.elems[this->pos] == INT_MIN && this->pos < this->set.m)
        this->pos++;
}

我并不是说这是最好的解决方案。事实上,它不是。但是,在你努力解决其他问题的时候,从不是最好的解决方案开始也是可以的,最终事情会 “咔嚓 “一声,你会意识到更好的解决方案。

给TA打赏
共{{data.count}}人
人已打赏
未分类

XSLT 1.0 : 需要对具有父ID的元素进行分组。

2022-10-22 13:23:40

未分类

如何停止一个被删除的python脚本[Mac]。

2022-10-22 13:23:42

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索