从未排序的向量中删除重复项: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中文网其他相关文章!