通用集插入函数 int

Generic set insert function int

下一个任务有点问题。 insert 函数应该也适用于 int 类型,但不幸的是它不起作用。可能是什么问题?

插入函数调用的一些示例:

Set<int, 4> s0;

s0.insert(2);

这是一个四元素数组,第一个元素是 2。

template <class T, size_t n = 10>
class Set{
private:
    T adat[n];
public:
    size_t size (){return n;}
    bool isElement (T num){
        for (size_t i = 0; i < n; i++)
        {
            if (adat[i] == num)
                return true;
        }
        return false;
    }
    void insert (T data){
        if (!isElement(data)){
            size_t i = 0;
            while((adat[i] != 0)||(i != n))
                i++;
            if (i != n)
            {
                adat[i] = data;
            }
            else
                throw("The array is full!");
        }
    }
};

这可能是一个微妙的越界错误。酷

在这个 while 循环中

while((adat[i] != 0)||(i != n))
   i++;

你会越界,因为最后一个元素是“(n-1)”而不是“n”。由于条件中的“或”,你总是会越界。由于“或”的右边部分,循环将始终 运行 至少直到“i==n”。然后,越界后,访问的值“adat[i]”将不确定,并且很可能不为空。所以,你保障“i!=n”永远不会被触及。

这也是因为布尔快捷方式评估。如果“(adat[i] != 0)”已经为真,则“或”中的下一项没有意义,也不会被计算。

然后无限循环将 运行 永远。 . .

您还必须初始化“adat”数组,以确保它包含默认值。

这样做:T adat[n]{};

最后,要修复你的 while 循环,请写:

while ((adat[i] != 0) && (i < n)) {