2013-05-28 33 views
0

我有隨機數的數組忽略相同的號碼,例如C++中的數組

6 5 4 4 8 

我需要對它進行排序和刪除/忽略相同的數字在打印之後,所以我所做的是我整理一切與bubble sorth algorithm,得到了這樣的事情

4 4 5 6 8 

現在爲了只打印不同的號碼,我寫這個for loop

for(int i=0;i<n;i++){ 
    if(mrst[i]!=mrst[i-1] && mrst[i]>0){ 
     outFile << mrst[i] << " "; 
    } 
} 

我的問題是,我有的數組是在[0:12]的間隔,雖然我第一次調用它時,它會檢查數組索引-1以查看以前是否有相同的數字,但它並不是真的存在,但是存儲在那裏的值通常是巨大的,所以有可能存儲4,因此第一個數字不會被打印出來。如果是這樣,如何防止它,重寫代碼,以便它是最佳的?

+0

您不能在數組之前取消引用(不存在)元素,而是調用未定義的行爲。 – jrok

回答

4

那麼,正如你已經注意到,你不能做檢查mrst[i] != mrst[i-1]在案件i == 0所以我敢肯定你可以想辦法而不是這樣做檢查在這種情況下 ...(這看起來非常像一個家庭作業,所以我並不真的願意給你一個完整的解決方案,但我想我暗示了)

還要注意,它是未定義的行爲來訪問數組的邊界之外的內存,所以你在那裏做什麼可以做任何事情,從正常工作到崩潰程序,完全在編譯器的自由裁量權。

+0

讚賞提示,有時解決方案可以是如此簡單,只是不被注意,謝謝 – RnD

7

也許,你正在尋找std::unique算法:

std::sort(mrst, mrst + n); 
auto last = std::unique(mrst, mrst + n); 

for(auto elem = mrst; elem != last; ++elem) 
    outFile << *elem << " "; 
+0

這看起來很有趣,我會試一試,雖然喬伊的解決方案似乎更簡單和容易 – RnD

1

基本上你可以從堆中任何地方閱讀。所以mrst [-1]可能會給你一些內存垃圾。但你真的應該避免這樣做。在你的情況下,你可以改變「mrst [i]!= mrst [i-1] & & mrst [i]> 0」到「i == 0 || mrst [i]!= mrst [i-1]」 。

在C++「A || B」中,如果「A」沒有問題,不要執行「B」。