我对C ++很陌生,我尝试使用带有容器类的用户定义类型结构,在本例中是一个集合。
我知道要存储用户定义类型的元素,这些元素不能使用内置的关系运算符进行比较,我需要编写一个比较回调函数并将其传递给Set构造函数。但是,我无法弄清楚这是什么语法。
我在.cpp文件中定义了这个:
Set<struct> included;
然后在头文件中定义:
struct pointT {
int row;
int col;
bool operator==(PointT p1, PointT, p2) {
return p1.x == p2.x && p1.y == p2.y;
}
};
这是我需要做的全部,还是我在这里错过了一些大的,因为代码似乎没有被编译,因为类型无法被识别?
我已经在这个网站上查找了类似的答案,但我找不到任何具体和明确的情况。任何帮助将不胜感激。
答案 0 :(得分:2)
首先,选择班级的名称;您以不同的方式pointT
,PointT
和struct
(这甚至不是有效名称)进行调用。我只是称之为point
,因为我不喜欢名字上的奇怪装饰。
然后您需要决定成员名称:他们是row
和col
还是x
和y
?我会选择第一个。
要将其存储在std::set
中(或者,通常,将其用作标准关联容器中的键),您需要operator<
,而不是operator==
,因为关联键是有序的。这可以是带有一个参数的成员函数(this
是左手操作数,参数是右手):
struct point {
int row;
int col;
bool operator<(point const & rhs) {
return std::tie(row, col) < std::tie(rhs.row, rhs.col);
}
};
或具有两个参数的非成员:
bool operator<(point const & lhs, point const & rhs) {
return std::tie(lhs.row, lhs.col) < std::tie(rhs.row, rhs.col);
}
请注意,我的示例实现需要C ++ 11 <tuple>
标头,并假设您需要字典排序(或者不要特别关心排序)。如果你过去陷入困境,那么你需要自己写下来;类似的东西:
bool operator<(point const & lhs, point const & rhs) {
if (lhs.row < rhs.row) return true;
if (rhs.row < lhs.row) return false;
return lhs.col < rhs.col;
}
如果Set
的行为与标准关联容器不同,那么它可能还有其他要求;但我无法猜出它们可能是什么。您必须查阅该课程的文档。
答案 1 :(得分:0)
您可以尝试这样的事情:
#include <iostream>
#include <set>
namespace point {
struct PointT {
int x;
int y;
};
bool operator==(const PointT& p1, const PointT& p2) {
return p1.x < p2.x || (p1.x == p2.x && p1.y < p2.y);
}
bool operator<(const PointT& p1, const PointT& p2) {
return p1.x < p2.x && p1.y < p2.y;
}
bool operator<=(const PointT& p1, const PointT& p2) {
return p1 < p2 || p1 == p2;
}
bool operator>(const PointT& p1, const PointT& p2) {
return p2 < p1;
}
bool operator>=(const PointT& p1, const PointT& p2) {
return p2 < p1 || p1 == p2;
}
}
int main()
{
using namespace point;
std::set<PointT> s{ { 1, 2 }, { 2, 3 }, { 3, 4 }, { 4, 5 }, { 1, 2 } };
for (const auto& e : s) std::cout << "(" << e.x << "," << e.y << ")" << std::endl;
return 0;
}