我一直在设置实例化错误。尝试修复它,无论如何,我似乎无法实现SET。尝试使用向量,但我不知道如何正确实现相等运算符,也失败了。
起初我使用矢量,但在尝试保持x和y值唯一时很难使用。意思是,我会读取数据的文本文件。
Point1, [3, 10]
Point2, [10, 10]
因此,Point 1将从Point 2转到不同的向量,然后单独存储数据。但不知何故,在文本文件中有Point1的重复值,[3,10]。我不想插入另一个相同的记录,并希望它们是独一无二的。所以我尝试使用set但我无法真正插入数据。
错误是:
在成员函数'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:错误:没有 匹配'operator<'在'_ x< _y'
中
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
Main.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;
}
}
}
答案 0 :(得分:2)
如果你想把Point放在一个集合中,那么set需要一种方法来比较一个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<
),只要你遵守严格弱顺序的规则。
答案 1 :(得分:1)
std::set
需要比较函数或函数来比较两个Points
并应用严格的弱排序。你可以通过给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>;
}
};