1. 首页
  2. c++

你好,C++(68)10.5.2 删除容器中的冗余元素

想要抢先看后面的章节?打赏本文10元,即可获得带插图全本下载地址!
打赏完成记得私信我哦 :p

10.5.2 删除容器中的冗余元素

现实世界流行减肥,各位爱美女士都想减去自己身上多余的赘肉。这股减肥风潮也很快吹到了C++世界,各个容器也都嚷着要“减肥”——删除容器当中冗余的数据元素。

现实世界中的减肥比等房价下降还难,可是对于C++世界中的STL来说,“减肥”却是一件很容易的事情,只需要利用几个算法三下两下就可以删除容器中的冗余元素帮容器瘦身,效果要比那些个所谓的“减肥茶”好多了。本来这是STL的独家秘方,可是看各个容器求瘦心切,于是就大方公布出来,好让各个容器借此方一瘦为快。

很多时候,容器中都不可避免地会出现冗余元素,可能是用户错误地重复输入,也可能是程序处理过程中产生的冗余元素。这就像某些人喝凉水都会长肉一样,容器中冗余元素的出现,几乎是不可避免的:

// 这里的st1和st3虽然是不同的对象,但是它们的属性都相同, // 代表了相同的意义,因而可以认为它们是相互重复的,其中一个是冗余的元素 Student st1("ChenLiangqiao", 173); Student st2("WangGang", 163);  Student st3("ChenLiangqiao", 173); // 与st1相同 // 将这些对象都添加到容器中,容器中产生了冗余元素 vector<Student> vecStu = {st1,st2,st3};

冗余元素的出现,不仅会导致程序业务逻辑的混乱(两个对象表示了同一个实体事物,有可能产生不一致),同时还会浪费宝贵的内存资源(原本只需要两个Student对象空间的容器却不得不占用三个Student对象的空间)。容器中出现冗余元素不要紧,因为我们有STL祖传的“瘦身大法”,只要用上,很快就可以删除容器中的冗余元素,让容器恢复苗条身材。STL的“瘦身大法”一共有三步:

第一步,对容器中的所有数据进行排序。例如:

// 第一步:让容器中的Student对象按照身高排序 sort(vecStu.begin(), vecStu.end(), sortbyHeight);

第二步,也是最关键的一步,使用unique()算法删除容器中的冗余元素。unique()算法会调用容器中数据相应类型的“==”操作符来判断两个数据元素是否相等,如果两个元素相等,就删除其中的一个元素,只在容器中保留其中的一个。因为这里容器中的数据是自定义的Student类型的对象,所以需要先重载这个类的“==”操作符,然后才能使用unique()算法删除其中的冗余元素:

class Student { // … public:  // 重载“==”操作符,判断两个对象是否相同 // 如果两个对象的姓名和身高属性都相同,则认为这两个对象相同  bool operator == (const Student& st) const  {   // 使用“&&”保证两个条件同时成立 return m_strName == st.GetName()    && m_nHeight == st.GetHeight();  } // … }; // 第二步:删除容器中的冗余元素 auto it = unique( vecStu.begin(),   vecStu.end());

第三步,使用earse()算法彻底删除容器中的冗余元素。在第二步中,我们使用unique()算法删除容器中的冗余元素,其实并没有真正意义上从容器中删除这些冗余数据,而只是将这些冗余数据挪动到了容器的末尾位置,同时它会返回一个指向容器中有效数据的结束位置的迭代器。通过从begin()到这个迭代器范围,我们就可以访问到容器中没有冗余的所有数据。从使用的意义上来讲,unique()算法让我们可以访问容器中所有没有冗余的数据,达到了删除容器中冗余数据的目的,但是这些冗余数据实际上仍然存在于容器中,仍然严重影响着容器的身材,所以作为STL“瘦身大法”的最后一步,还需要使用erase()算法从容器中彻底删除这些冗余数据,达到真正“瘦身”的目的:

// 第三步:删除容器末尾遗留的多余元素 vecStu.erase( it, vecStu.end() );

从此,身轻如燕!

原文始发于:你好,C++(68)10.5.2 删除容器中的冗余元素

主题测试文章,只做测试使用。发布者:杀手梦三刀,转转请注明出处:http://www.cxybcw.com/7659.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code