【发布时间】:2020-08-30 09:10:08
【问题描述】:
我必须在 C++ 中使用散列表(开放寻址和双散列)来实现 ADT 集。 我的迭代器有问题,它没有通过下一个测试:
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);
}
它不会传递评论的资产。这就是我实现这些方法的方式:
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];
}
有人可以帮帮我吗?我不知道为什么会这样。
【问题讨论】:
-
与其捕捉和断言,不如不捕捉。程序将中止,您可能会收到一条很好的错误消息,告诉您抛出了什么。
-
如果你确切地知道哪些断言失败了,你难道不知道你必须做什么吗?例如,测试期望
it.next()为空集的迭代器抛出异常。为什么你的::next()没有?以此类推。 -
您的代码中没有一条
throw语句,所以我不知道您为什么希望抛出任何异常。 -
我明白了。所以我必须检查它是否有效,如果不抛出异常
-
@AndreiGabor - 没错。你在我回答之前几秒钟,你明白了:-)
标签: c++ algorithm data-structures iterator set