在c ++中设置函数不起作用

时间:2016-02-04 04:19:47

标签: c++ arrays if-statement for-loop set

我在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;容量(意味着它们仍然是空间)然后插入数字。当我使用插入功能时没有任何反应。有人可以帮助我吗?也许我接近这个错误的方式。

2 个答案:

答案 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";
    }
}