我想知道是否有一种有效的方法可以根据对象的成员字段值从容器中删除对象.例如,我可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
打印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;
}
Run Code Online (Sandbox Code Playgroud)
谢谢
有两种选择可以使用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;
}
Run Code Online (Sandbox Code Playgroud)将矢量保持为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;
}
Run Code Online (Sandbox Code Playgroud)作为替代unique,您可以简单地将元素插入中set(或unordered_set在C ++ 11中)。
无论您决定采用哪种方式,都需要为定义比较运算符Packet。因为unique,你需要operator==; 因为set你需要operator<。为了完整起见,您应该同时定义它们及其对应物:
class Packet {
…
bool operator==(const Packet& p) const {
return fillingTime == p.fillingTime && recordID == p.recordID;
}
bool operator<(const Packet& p) const {
return fillingTime < p.fillingTime ||
(fillingTime == p.fillingTime && recordID < p.recordID);
}
bool operator!=(const Packet& p) const { return !(*this == p); }
bool operator> (const Packet& p) const { return p < *this; }
bool operator>=(const Packet& p) const { return !(*this < p); }
bool operator<=(const Packet& p) const { return !(p < *this); }
…
};
Run Code Online (Sandbox Code Playgroud)
如果使用C ++ 11 unordered_set,则需要更进一步,并定义一个哈希函数。
编辑:我只是注意到您正在存储指向的指针Packet。为什么?只需Packet直接存储。
| 归档时间: |
|
| 查看次数: |
14524 次 |
| 最近记录: |