我组织了两个结构向量。现在我需要从点中删除选择中的内容。
#include <StdAfx.h>;
#include <iostream>;
#include <vector>;
using namespace std;
struct SPoint
{
int id;
int X;
int Y;
};
vector<SPoint> points;
vector<SPoint> chosen;
void print_vect(const vector<SPoint> & vect)
{
for (int i = 0; i < vect.size(); ++i)
{
cout << vect[i].id << " (" << vect[i].X << "," << vect[i].Y << ")"<<endl;
}
cout << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
SPoint temp;
for (int i = 0; i < 10; i++)
{
temp.id = i;
temp.X = i;
temp.Y = i;
points.push_back(temp);
}
for (int i = 5; i < 10; i++)
{
temp.id = i;
temp.X = i;
temp.Y = i;
chosen.push_back(temp);
}
cout << "Points:" << endl;
print_vect(points);
cout << endl << endl;
cout << "Chosen:" << endl;
print_vect(chosen);
system("pause");
return 0;
}
似乎有set_difference功能。但调试器告诉我,我没有'&lt;'方法。它告诉我们这样的事情:
error C2784: 'bool std::operator <(const std::move_iterator<_RanIt> &,const std::move_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::move_iterator<_RanIt> &' from 'SPoint
我用C ++学习过程编程。我不知道如何处理这种方法。在我看来,用“&lt;”来做这件事是不可能的。
你能帮我执行减法吗?
答案 0 :(得分:1)
是的,你猜对了。 std::set_difference 函数需要&lt;操作员运作。它使用它来检查相等性(!a
The comparison to check for equivalence of values, uses either
operator< for the first version, or comp for the second, in order to
test this; The value of an element, a, is equivalent to another one,
b, when (!a<b && !b<a) or (!comp(a,b) && !comp(b,a)).
您需要做的就是添加如下所示的功能
bool operator<(const SPoint& p1, const SPoint&p2){
return p1.id <p2.id;
}
假设您的id
字段是唯一字段。现在,您将能够使用std::set_difference
功能。这会将两个SPoint
变量按其id
字段进行比较。
请注意,BOTH范围需要排序才能正常工作。
答案 1 :(得分:0)
您可以使用例如std::remove_if
:
std::remove_if(std::begin(points), std::end(points), [](const SPoint& point) {
// Try to find the point in the `chosen` collection
auto result = std::find_if(std::begin(chosen), std::end(chosen),
[](const SPoint& p) {
return (p.id == point.id)
});
// Return `true` if the point was found in `chosen`
return (result != std::end(chosen));
});
请注意,我在上面的代码中使用了C ++ 11 lambda functions。