std :: unique并从对象的容器中删除重复项 [英] std::unique and removing duplicates from a container of objects

查看:178
本文介绍了std :: unique并从对象的容器中删除重复项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道是否有一种基于对象的成员字段值从容器中删除对象的有效方法。例如,我可以使用stl :: unique和字符串列表来执行以下操作:

I would like to know if there is an efficient way to remove objects from a container based on values of member fields of the objects. For example, I can do the following using stl::unique with a list of strings:

#include<iostream>
#include<list>
#include<string>
#include<algorithm>
using namespace std;

bool stringCompare(const string & l, const string & r)                                                                                   
{                                                                                                                                    
   return (l==r);                                                                                                                         
}

int main()                                                                                                                               
{                                                                                                                                        

  list<string> myStrings;                                                                                                                
  myStrings.push_back("1001");                                                                                                           
  myStrings.push_back("1001");                                                                                                           
  myStrings.push_back("81");                                                                                                             
  myStrings.push_back("1001");                                                                                                           
  myStrings.push_back("81");                                                                                                             

  myStrings.sort();                                                                                                                      
  myStrings.erase(unique(myStrings.begin(), myStrings.end(), stringCompare), myStrings.end());                                           

  list<string>::iterator it;                                                                                                             
  for(it = myStrings.begin(); it != myStrings.end(); ++it)                                                                               
  {                                                                                                                                      
    cout << *it << endl;                                                                                                                 
  }                                                                                                                                      

  return     0;                                                                                                                              
}

打印1001,81 ...

prints 1001, 81...

有一种方法,我可以做类似下面的代码,或者我需要使用运算符和迭代通过容器手动执行比较。我不能想到一个更优雅的解决方案,想知道如果这是可能没有写了很多代码。任何帮助将非常感激!

Is there a way I can do something similar with the following code, or do I need to perform the comparisons "manually" using operators and iterating through the containers. I couldn't think of a more elegant solution and would like to know if this is possible without writing a lot of code. Any help will be much appreciated!

class Packet
{
public:
Packet(string fTime, string rID) : filingTime(fTime), recordID(rID)

  string getFilingTime() {return filingTime;}
  string getRecordId() {return recordID;}

private:
  string filingTime;
  string recordID;

};

int main()
{
vector<Packet*> pkts;
pkts.push_back(new Packet("10:20", "1004"));
pkts.push_back(new Packet("10:20", "1004")); // not unique (duplicate of the line above)
pkts.push_back(new Packet("10:20", "251"));
pkts.push_back(new Packet("10:20", "1006"));

// remove packet from vector if time and ID are the same

return 0;
}

感谢

推荐答案

两个选项可以使用 std :: unique

Two options to be able to use std::unique:


  1. 定义 方法,并将向量< Packet *> 更改为 vector< Packet>

bool Packet::operator==(const Packet& rhs) const
{
    if (getFilingTime() != rhs.getFilingTime())
        return false;
    if (getSpid() != rhs.getSpid())
        return false;
    return true;
}

//etc.

int main()
{
    vector<Packet> pkts;
    pkts.push_back(Packet("10:20", "1004"));
    pkts.push_back(Packet("10:20", "1004")); // not unique (duplicate of the line above)
    pkts.push_back(Packet("10:20", "251"));
    pkts.push_back(Packet("10:20", "1006"));

    // remove packet from vector if time and ID are the same

     pkts.erase(unique(pkts.begin(), pkts.end()), pkts.end());                   

    return 0;
}


  • 保持向量为 *> 并定义一个方法来比较元素。

  • Keep the vector as vector<Packet*> and define a method to compare the elements.

    bool comparePacketPtrs(Packet* lhs, Packet* rhs)
    {
        if (lhs->getFilingTime() != rhs->getFilingTime())
            return false;
        if (lhs->getSpid() != rhs->getSpid())
            return false;
        return true;
    }
    
    //etc.
    
    int main()
    {
        vector<Packet*> pkts;
        pkts.push_back(new Packet("10:20", "1004"));
        pkts.push_back(new Packet("10:20", "1004")); // not unique (duplicate of the line above)
        pkts.push_back(new Packet("10:20", "251"));
        pkts.push_back(new Packet("10:20", "1006"));
    
        // remove packet from vector if time and ID are the same
    
         pkts.erase(unique(pkts.begin(), pkts.end(), comparePacketPtrs), pkts.end());                   
    
        return 0;
    }
    


  • 这篇关于std :: unique并从对象的容器中删除重复项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆