通用集插入函数 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)) {
下一个任务有点问题。 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)) {