c++ - std::unique 并从对象容器中删除重复项

标签 c++ stl std

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

#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...

有没有一种方法可以用下面的代码做类似的事情,或者我是否需要使用运算符“手动”执行比较并遍历容器。我想不出更优雅的解决方案,并且想知道这是否可以在不编写大量代码的情况下实现。任何帮助都感激不尽!

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 :

  1. 定义一个 operator== Packet 的方法并更改 vector<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;
    }
    
  2. 保持 vector 为vector<Packet*>并定义一个方法来比较元素。

    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;
    }
    

关于c++ - std::unique 并从对象容器中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12850181/

相关文章:

c++ - 在函数周围传递 char[]

c++ - MinGW 上 C++17 <文件系统> 的编译错误

c++ - 如何在 STL 容器和成员函数调用中存储模板化对象

c++ - 为第二个范围内的重复项设置差异,替代 remove_copy

c++ - std::enable_if<> 错误

c++ - Std::vector 不更改类内的数据

c++ - 我们怎样才能制作聚光灯

C++ 模块和 C++ ABI

c++ - 如果我创建一个 list<T>::iterator,有没有办法重载++(增量)运算符?

c++ - 在 C++ 中拆分空分隔字符串序列的简单方法