0

構造の 2 つのベクトルを整理しました。次に、選択したポイントから何を削除する必要があります。

#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 関数があるようです。しかし、デバッガーは、「<」メソッドがないことを教えてくれます。それは次のようなことを伝えます:

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++で手続き型プログラミングを勉強しています。そして、私はこの方法で何をすべきかわかりません。そして、ここで「<」では何もできないように思えます。

引き算を手伝ってくれませんか?

4

2 に答える 2

1

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ラムダ関数を使用していることに注意してください。

于 2013-01-07T05:59:38.530 に答える
1

はい、あなたは正しく推測しました。std::set_difference関数が機能するには < 演算子が必要です。(!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これは、フィールドごとに 2 つの変数を比較しidます。

正しく機能させるには、両方の範囲をソートする必要があることに注意してください。

于 2013-01-07T05:18:22.203 に答える