2013-06-12 113 views
2

我有一個數組中,我都不理,刪除所有這些都是repetitive數字,C++聲明數組索引爲空

例如1 2 4 3 3 0 1 2 0

我所做的是什麼我查了號碼,並試圖像\0NULL這樣的東西,但它們都給出了0的值,所以它不是一個解決方案。那麼有沒有辦法讓索引變空或只是忽略它?數字必須是隨機的,所以我不能聲明像

array[i]=123; 
if(array[i]==123) dont_print_out(); 

回答

5

如果你的數組是一個普通的C++數組,你沒有方法來「刪除」項目。 您唯一的解決方案是將剩餘的項目移到左側。

如果您的陣列是std::vector,則可以使用erase函數。但是,由於矢量中基礎數據的結構,您的工作基本上和以前一樣:效率很低。

如果您想要有效地移除隨機位於您序列中的物品,請考慮使用另一種容器,如std::list

最後,要達到您的目標,請看std::setstd::unordered_set。這些容器確保您的物品是唯一的。

+0

1.使用'std :: list'來支持隨機刪除幾乎總是一個錯誤。在遍歷列表中找到重複項比在刪除本身快時獲得的更多。 2.具有'std :: unique'的向量通常比'std :: set'甚至'std :: unordered_set'快。 3。只要您不關心維護原始訂單,您就可以有效地從矢量中刪除。 –

+0

@Jerry棺材:3 OK,如果移動端項目通過去除產生的_hole_,是否正確? –

+0

您通常需要將要移除的項目交換到最後。隨着'int'複製將被罰款,但像'的std :: string'或'的std :: VECTOR',掉期通常會更快(這將是非常不尋常的它是多少,如果有的話,速度較慢) 。 –

2
  1. 使用std::vector而不是數組,這樣你就可以刪除項目。
  2. 如果您不需要維護原始訂單,可能最容易進行排序,然後使用std::unique消除重複項。

代碼可能是這個樣子:

std::vector<int> numbers; 

srand(time(NULL)); 

std::generate_n(std::back_inserter(numbers), 10, rand); 
std::sort(numbers.begin(), numbers.end()); 
std::copy(numbers.begin(), std::unique(numbers.begin(), numbers.end()), 
      std::ostream_iterator<int>(std::cout, "\t")); 

// Or, as @Chris pointed out: 
std::unique_copy(numbers.begin(), numbers.end(), 
      std::ostream_iterator<int>(std::cout, "\t")); 

注意,因爲std::unique返回一個迭代器唯一的數字,我們實際上並不需要在所有抹去別人的範圍的結束 - - 我們可以將其用作我們顯示範圍的結尾。

另外請注意,我在這裏所產生的數字,它實際上是相當不尋常的刪除任何東西 - 給一個典型的實施rand()產生號碼的範圍,這將是相當不尋常的看到它產生的任何重複只有10次迭代。

如果你確實需要保持原來的順序,你有幾個選擇。一種是在打印出來時將每個項目插入std::set(或std::unordered_set)中,並且僅在插入集合成功(即以前不存在)的情況下才打印它。


1.儘管這許多只有一個原因,更喜歡std::vector一個數組。

+0

不要忘記['標準:: unique_copy'(http://en.cppreference.com/w/cpp/algorithm/unique_copy):) – chris

+0

@克里斯:謝謝你的提醒。 –