-7

インスタンス化されたエラーが発生し続けました。どうにかして修正してみてください。SETを実装できないようです。ベクトルを使用してみましたが、等値演算子を適切に実装する方法がわかりませんし、失敗しました。

最初はベクトルを使用していましたが、x と y の値を一意に保ちながら使用するのは困難でした。つまり、データのテキスト ファイルを読み取ります。 Point1, [3, 10] Point2, [10, 10]

したがって、ポイント 1 はポイント 2 とは異なるベクトルに移動し、データを個別に保存します。しかし、どういうわけか、テキスト ファイルには Point1、[3、10] の繰り返し値があります。別の同じレコードを挿入したくなく、それらを一意にしたい. だから私はセットを使ってみましたが、実際にはデータに挿入できませんでした。

エラーは次のとおりです。

メンバー関数 'bool std::les<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Point]': STL_TREE.h:980: 'std::pair::iterator からインスタンス化されました。 bool> std::_Rb_tree<_Key,.... STL_SET.h:307: 'std::pair, _Compare, typename _Alloc::rebind<_Key>::other>::const_interator, bool> std:: からインスタンス化set..... main.cpp:141: ここからインスタンス化されました stl_function.h:227: エラー: '_ x < _y'の 'operator<' に一致しません

Point.h

#ifndef POINT_H
#define POINT_H 

#include <iostream>
#include <ostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <math.h>
#include <set>
#include <string.h>
#include <string>
#include <stdio.h>

using namespace std;

class Point
{
    friend ostream& operator<<(ostream&, const Point&);

    protected:
        int x, y;

    public:
        //c'tor
        Point(int xx, int yy);

        //setters
        void setX(int x1);
        void setY(int y1);

        //getters
        int getX() const {return x;};
        int getY() const {return y;};
};

Point::Point(int xx, int yy) : x(xx), y(yy)
{

}

void Point::setX(int x1)
{
    x=x1;
}

void Point::setY(int y1)
{
    y=y1;
}

#endif

メイン.cpp

#include "Point.h"
#include <iostream>
#include <ostream>
#include <fstream>
#include <sstream>
#include <set>
#include <math.h>
#include <set>
#include <string.h>
#include <string>
#include <stdio.h>
#include <map>
#include <algorithm>
#include <map>

using namespace std;

class Main
{
    public: 
        void mainMenu();
        void stringToUpper(string &s);
};

void stringToUpper(string &s)
{
    for(unsigned int l=0; l < s.length(); l++)
    {
        s[l] = toupper(s[l]);    
    }
}

void Main::mainMenu()
{
    cout<<"1)   type filename and read data"<<endl;
    cout<<"2)   View data"<<endl;    
    cout<<"Q)   Enter 'Q' to quit"<<endl<<endl;
}

int main()
{
    Main main;
    char menuChoice;
    bool quit=false;
    int count = 0;

    set<Point> p;

    while ( !quit)
    {
        main.mainMenu();
        cout << "Please enter your choice : ";
        cin>>menuChoice;
        menuChoice = toupper(menuChoice);

        switch(menuChoice)
        {
            case '1':
                {
                    string line, name;
                    char filename[50];
                    int x,y;

                    cout << "Please enter filename : ";
                    cin >> filename;

                    ifstream myfile(filename);
                    if (myfile.is_open())
                    {
                        while ( myfile.good() )
                        {
                            getline(myfile, line);
                            {      
                                for (unsigned int i = 0; i < line.size(); ++i) 
                                {
                                    if (line[i] == '[' || line[i] == ']' || line[i] == ',') 
                                    {
                                        line[i] = ' ';
                                    }
                                    istringstream in(line);
                                    in >> name >> x >> y;                                  
                                }
                                if(name == "Point")
                                {
                                p.insert(Point(x,y))    }                        
                            }                                
                            count++;
                        }    
                        myfile.close();
                        cout << count;
                    }
                    else cout<< "Unable to open file";
                }
                break;                             
            case '2':
                {
                cout<<"view data"<<endl;
                }                   
            case 'Q':
                cout<<"You have chosen to quit!"<<endl;
                quit=true;
                exit(0);
            default:
                cout<<"Invalid entry"<<endl<<endl;
                break;
        }
    }
}
4

2 に答える 2

2

Point をセットに入れたい場合、セットには、ある Point を別の Point と比較してそれらを並べ替える方法が必要です。この関数を宣言する必要があります

bool operator<(const Point& p1, const Point& p2)
{
    ...
}

それを行うと、インスタンス化できるようになりますstd::set<Point>

通常の実装は次のようになります

bool operator<(const Point& p1, const Point& p2)
{
    return p1.x < p2.x || p1.x == p2.x && p1.y < p2.y;
}

厳密な弱い順序付けoperator<のルールに従っている限り、順序が何であるかは実際には問題ではありません (そうでなければ、おそらくもっと早く必要であることに気付いたと思います) 。

于 2012-11-13T13:21:38.427 に答える
1

std::setPoints2 つを比較し、厳密な弱い順序付けを適用する比較関数またはファンクターが必要です。Pointこれは、より小さい比較関数を指定することで実現できます。

これは、次を使用して簡単に実装できますstd::tie

#include <tuple> // for std::tie

class Point
{
    // rest as before
    friend bool operator<(const Point& lhs, const Point& rhs)
    {
      return std::tie<lhs.x, lhs.y> < std::tie<rhs.x, rhs.y>;
    }
};
于 2012-11-13T13:23:10.237 に答える