從未排序的向量中刪除重複項:STL 演算法的漫步
當面臨從未排序的向量中剔除重複元素的任務時保留初始順序,很容易開始迭代方法,乏味地追蹤和刪除不需要的條目。但等等,還有更好的方法──一條用 STL 演算法鋪就的道路。
STL 去重階梯
STL 擁有強大的演算法庫,包括 std ::copy_if,專為此類場景精心設計。這個神奇的藥水需要一個可迭代的來源(就像你的向量)、一個目的地(你希望重複消失的地方)和一個謂詞來引導選擇過程。
製作重複偵測器
解鎖 std::copy_if 能力的關鍵在於製作一個可以嗅探的自訂謂詞重複。在這裡,我們介紹 NotDuplicate——一個函數對象,它急切地將元素插入到集合中,並採用「集合不能容納所有元素」的神聖原則。當之前遇到過一個元素時,它會優雅地返回 false。
演算法的快速滑動
有了我們值得信賴的 NotDuplicate 謂詞,我們可以呼叫 std::copy_if 來優雅地遍歷我們的向量。每個元素都會呈現給 NotDuplicate,它會參考其已看到的元素集,並且只允許真正的新元素通過。獨特的倖存者滑入目的地容器,留下複製品在數位空間中消亡。
一窺程式碼的恩典
讓我們一窺我們的幕後花絮花絮優雅的解決方案:
std::vector<int> uniqueNumbers; NotDuplicate<int> pred; std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(uniqueNumbers), std::ref(pred));
這個原始程式碼片段召喚NotDuplicate 來協助std::copy_if,快速篩選你的向量並編織一個新的無重複掛毯。
在C 11 的擁抱中
如果你有幸擁有甜蜜的擁抱借助C 11,您可以釋放lambda 的迷人力量,並用簡潔的方式裝飾您的程式碼優雅:
std::vector<int> uniqueNumbers; std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(uniqueNumbers), [](const int& element) { return s_.insert(element).second; // true if s_.insert(element); });
重點:演算法,你堅定的盟友
記住,STL 演算法的目的不是把你變成演算法嚮導,而是增強演算法能力你的程式設計能力。擁抱他們豐富的功能,您會發現自己輕鬆有效地釋放了程式碼的全部潛力。
以上是STL 演算法如何幫助從未排序的向量中刪除重複項?的詳細內容。更多資訊請關注PHP中文網其他相關文章!