我在c ++中编写了一个Set类(我知道已经有一个库,这是一个赋值),类似于C ++中的一个我正在编写一个函数来检查输入的条目是否已经在集合中
void Set::insert(const Set::value_type& entry)
{
for (int i=0; i<used;i++)
{
if(data[i]!=entry && used<CAPACITY)
{
data[used] = entry;
used++;
}
else
{
throw "Out of capacity in Set and Intger already in Set";
}
}
}
该功能的作用是查看数字是否在集合中。如果该数字不在该集合中并且如果使用&lt;容量(意味着它们仍然是空间)然后插入数字。当我使用插入功能时没有任何反应。有人可以帮助我吗?也许我接近这个错误的方式。
答案 0 :(得分:3)
正如所写,当insert
- 空Set
时,used
将为0,因此循环终止而不做任何事情。你没有处理循环后没有找到值的情况,因此它永远不会插入。
即使你切换到CAPACITY
循环,内部检查将在第一次运行时用相同的值填充整个Set
(因为if
检查的块执行,但是不会break
循环,所以它会一遍又一遍地存储相同的值,直到它填满Set
或找到它自己),然后在后续的insert
上,它会立即引发异常满满的。也许你想要这样的东西?
void Set::insert(const Set::value_type& entry)
{
// If you have a membership test function, you can reuse it here instead
// of including this loop, e.g.:
// if (this->contains(entry)) return;
for (int i=0; i < used;i++)
{
if (data[i] == entry) {
// value already in set, nothing to do
return;
}
}
// Not already in Set, add if we have room or raise exception
if (used < CAPACITY) {
data[used++] = entry;
return;
}
throw "Out of capacity in Set";
}
答案 1 :(得分:3)
当该集合最初为空时,used == 0
,您的循环不会执行任何操作,因为i < used
条件会立即失败。因此,您永远不会将新项目添加到集合中。
如果集合中有项目,则循环会将新条目添加到集合中,如果它与任何现有元素不同。它为每个不等于的元素重复添加它。
您需要做的是浏览整个集合,看看是否在任何地方找到了匹配项。如果它在没有找到匹配的情况下通过整个循环,则会添加新条目。
void Set::insert(const Set::value_type& entry)
{
for (int i=0; i<used;i++)
{
if(data[i] ==entry)
{
return;
}
}
// Not found, add it
if (used < CAPACITY) {
data[used++] = entry;
} else
{
throw "Out of capacity in Set";
}
}