【问题标题】:Set function in c++ not working [closed]在c ++中设置函数不起作用[关闭]
【发布时间】:2016-02-04 04:19:47
【问题描述】:

我正在用 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";
            }
        }

}

该函数的作用是查看数字是否在集合中。如果号码不在集合中并且如果使用

【问题讨论】:

  • 如果您的集合中没有条目,则由于您的 if 语句,您正在添加条目使用次数。但是你使用的增长,所以你的循环被卡住了,它无法摆脱它。
  • 请提供Minimal, Complete, and Verifiable exampledata 似乎是一个成员变量,used 也是如此,所以我们猜测其中大部分是如何工作的。提供可以复制/粘贴到编译器中的示例,或使用an online C++ compiler 发布和分享您的代码,以便我们提供有意义的答案。
  • @OlzhasZhumabek 这是假设used 每次迭代都会自动更新。如果 OP 陷入无限循环,那么通过代码中的简单日志语句应该很容易诊断。
  • 如果条目不在集合中,您的循环不会测试。它只是测试集合中的任何元素是否与条目不同。要检查它是否不在集合中,您必须检查所有使用过的条目,看看是否永远找不到它。
  • 我注意到了这些问题,但使它成为 noop 的问题是它循环到 used,最初为 0,因此外部循环根本不会运行,除非填充了 Set其他方式。循环内的所有错误逻辑永远不会出错。

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


【解决方案1】:

正如所写,当insert-ing 到一个空的Set 时,used 将是 0,所以循环终止而不做任何事情。您不处理循环后未找到值的情况,因此它永远不会插入。

即使您切换到循环到CAPACITY,内部检查也会在第一次运行时用相同的值填充整个Set(因为if 的检查块会执行,但不会break循环,因此它会一遍又一遍地存储相同的值,直到它填满Set 或找到它自己),然后在随后的inserts 上,它会立即引发一个满的异常。也许你想要这样的东西?

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

【讨论】:

  • 它不会替换现有值,因为新条目放在data[used],而不是data[i]
  • 但除此之外,伟大的思想都一样:)
  • @Barmar 你是对的,它并没有替换值 im 只是使用 data[i] 来检查整个数组或集合。非常感谢 ShadowRanger,我猜我的大脑工作不正常。我现在明白我的错误谢谢
  • 糟糕。固定的。它基本上是“在第一次调用时,如果循环测试运行到CAPACITY,它将用相同的值填充整个Set,然后在未来出错。”从多个方面来看,这都是非常糟糕的代码。
  • @ShadowRanger 是的,我知道(它的代码很糟糕..haha)它只是为了分配我宁愿只使用 c++ 中的集合库。哈哈
【解决方案2】:

当集合最初为空时,即used == 0,您的循环不会做任何事情,因为i &lt; 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";
    }
}

【讨论】:

    猜你喜欢
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多