我有两个自定义对象向量定义如下
struct PrimitiveInfo
{
std::list<int> symbolNumbers;
//other attributes here....
};
我有这两个载体
std::vector<PrimitiveInfo> m_symbolPrimitiveList;
std::vector<PrimitiveInfo> m_newPrimitiveList;
这两个向量由Data的其他方法填充。
现在我要添加m_newPrimitiveList
项目,这些项目与m_symbolPrimitiveList
对于Eg:如果一个新的primitivelist对象包含symbolNumbers为1,2,3
我只需要将该对象添加到m_symbolPrimitiveList
向量,只要它没有一个符号为{{1}的对象在他们的名单中。如果它有一个带有符号编号1,2,3
的对象,我就不会将新对象添加到1,2,3
。
这可以通过for循环完成,但我想知道是否有更聪明的方法来实现这一目标?我没有使用C ++ 11
答案 0 :(得分:0)
以下是我对你案件的建议。您可能希望根据需要更改此代码,尤其是检查数字列表的部分
struct MyStruct
{
public:
list<int> numbers;
friend bool operator== (const MyStruct& p1, const MyStruct& p2);
};
bool operator== (const MyStruct& p1, const MyStruct& p2)
{
// change as you want to check if objects are equal
list<int> l1 = p1.numbers;
list<int> l2 = p2.numbers;
for (list<int>::const_iterator it1=l1.begin(); it1 != l1.end(); ++it1) {
list<int>::iterator it2 = find(l2.begin(), l2.end(), *it1);
if (it2 != p2.numbers.end()) {
// at least one element is found, treat it as equal
cout << "equal " << *it1 << endl;
return true;
}
}
cout << "not equal" << endl;
return false;
}
bool checkInfo(MyStruct info, vector<MyStruct> v2)
{
bool found = false;
vector<MyStruct>::iterator it = find(v2.begin(), v2.end(), info);
// true if info is found in v2
return it != v2.end();
}
使用方法是:
vector<MyStruct> s1;
vector<MyStruct> s2;
list<int> l1;
l1.push_back(1);
l1.push_back(2);
MyStruct p1;
p1.numbers = l1;
s2.push_back(p1);
s2.push_back(p1);
for (int i =0; i < s2.size(); i++) {
if (checkInfo(s2[i], s1)) {
// found, do not add
cout << "found. skipp adding" << endl;
}
else
{
cout << "not found, so need to add " << endl;
s1.push_back(s2[i]);
}
}