使用哈希表设置实现
Set implementation using hash table
我必须在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];
}
有人可以帮我吗?我找不到为什么会这样。
让我们确保您首先了解 try-catch。
try {
// some code
assert(false);
}
catch (exception& e) {
assert(true);
}
这是一种说法,">我希望某些代码会因引发异常而失败。因此,如果它没有抛出异常,我们通过断言 false 来标记它。如果它确实抛出异常,我们会捕获它,以便我们的程序不会崩溃,并断言 true 并继续前进。
让我们以第一个测试为例。
给定一个空集的迭代器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++;
}
我并不是说这是最好的解决方案。其实不然。但是,在解决其余问题的同时,从不是最好的解决方案开始是可以的,最终事情会"点击",你会实现更好的解决方案。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 如果没有malloc,链表实现将失败
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在c++中实现处理器调度模拟器
- 嵌套在类中时无法设置成员数据
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 使用简单类型列表实现的指数编译时间.为什么
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 使用哈希表设置实现
- 实现区域设置格式的时间输出
- 使用 Boost 实现更好的 XML 格式设置
- 使用Google mock,如何在不关心/设置任何调用期望的情况下提供模拟实现
- 设置菜单UI实现
- 在实现程序的配置设置时,什么是好方法
- visual studio-如何设置VS2008以实现高效的C++开发