我想知道是否有一种有效的方法可以根据对象成员字段的值从容器中删除对象。例如,我可以使用带有字符串列表的 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
:
定义一个
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; }
保持 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/