我對下一個任務有一點問題。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!");
}
}
};
uj5u.com熱心網友回復:
這可能是一個微妙的越界錯誤。涼爽的。
在這個while回圈中
while((adat[i] != 0)||(i != n))
i ;
你會越界,因為最后一個元素是“(n-1)”而不是“n”。由于條件中的“或”,您將始終超出界限。由于“或”的右側部分,回圈將始終至少運行到“i==n”。然后,在超出范圍之后,訪問的值“adat[i]”將是不確定的,并且很可能不是 null。所以,你保障“i!=n”永遠不會被觸及。
這也是因為布爾快捷方式評估。如果 "(adat[i] != 0)" 已經為真,那么 "or" 中的下一項沒有意義,也不會被評估。
然后無限回圈將永遠運行。. .
您還必須初始化“adat”陣列,以確保它包含默認值。
這樣做T adat[n]{};:
最后,要修復您的 while 回圈,請撰寫:
while ((adat[i] != 0) && (i < n)) {
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/465685.html
