我有一個數組中,我都不理,刪除所有這些都是repetitive
數字,C++聲明數組索引爲空
例如1 2 4 3 3 0 1 2 0
我所做的是什麼我查了號碼,並試圖像\0
和NULL
這樣的東西,但它們都給出了0的值,所以它不是一個解決方案。那麼有沒有辦法讓索引變空或只是忽略它?數字必須是隨機的,所以我不能聲明像
array[i]=123;
if(array[i]==123) dont_print_out();
我有一個數組中,我都不理,刪除所有這些都是repetitive
數字,C++聲明數組索引爲空
例如1 2 4 3 3 0 1 2 0
我所做的是什麼我查了號碼,並試圖像\0
和NULL
這樣的東西,但它們都給出了0的值,所以它不是一個解決方案。那麼有沒有辦法讓索引變空或只是忽略它?數字必須是隨機的,所以我不能聲明像
array[i]=123;
if(array[i]==123) dont_print_out();
如果你的數組是一個普通的C++數組,你沒有方法來「刪除」項目。 您唯一的解決方案是將剩餘的項目移到左側。
如果您的陣列是std::vector
,則可以使用erase
函數。但是,由於矢量中基礎數據的結構,您的工作基本上和以前一樣:效率很低。
如果您想要有效地移除隨機位於您序列中的物品,請考慮使用另一種容器,如std::list
。
最後,要達到您的目標,請看std::set
或std::unordered_set
。這些容器確保您的物品是唯一的。
std::vector
而不是數組,這樣你就可以刪除項目。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
一個數組。
不要忘記['標準:: unique_copy'(http://en.cppreference.com/w/cpp/algorithm/unique_copy):) – chris
@克里斯:謝謝你的提醒。 –
1.使用'std :: list'來支持隨機刪除幾乎總是一個錯誤。在遍歷列表中找到重複項比在刪除本身快時獲得的更多。 2.具有'std :: unique'的向量通常比'std :: set'甚至'std :: unordered_set'快。 3。只要您不關心維護原始訂單,您就可以有效地從矢量中刪除。 –
@Jerry棺材:3 OK,如果移動端項目通過去除產生的_hole_,是否正確? –
您通常需要將要移除的項目交換到最後。隨着'int'複製將被罰款,但像'的std :: string'或'的std :: VECTOR',掉期通常會更快(這將是非常不尋常的它是多少,如果有的話,速度較慢) 。 –