在编程任务中,我正在尝试确保特定向量仅包含唯一项。对于基本类型,操作非常简单:
vector<int> lala;
lala.push_back(1);
lala.push_back(99);
lala.push_back(3);
lala.push_back(99);
sort(lala.begin(), lala.end()); // lala: 1, 3, 99, 99
lala.erase(unique(lala.begin(), lala.end()), lala.end()); // lala: 1, 3, 99
然而,问题是我没有使用int。但是:
typedef struct
{
int x;
int y;
int maxX;
int maxY;
int width;
int height;
int id;
} Rect;
bool SameRect(Rect first, Rect second)
{
return first.x == second.x &&
first.y == second.y &&
first.width == second.width &&
first.height == second.height &&
first.maxX == second.maxX &&
first.maxY == second.maxY;
}
//...
vector<Rect> lala;
//...
sort(lala.begin(), lala.end());
lala.erase(unique(lala.begin(), lala.end(), SameRect), lala.end());
//...
不起作用。我做错了什么?
编辑:
根据sth的建议,我为std :: sort()实现了两个排序谓词:
bool SortRect(const Rect &first, const Rect &second)
{
if (first.x < second.x) return true;
if (first.x > second.x) return false;
if (first.y < second.y) return true;
if (first.y > second.y) return false;
if (first.maxX < second.maxX) return true;
if (first.maxX > second.maxX) return false;
if (first.maxY < second.maxY) return true;
if (first.maxY > second.maxY) return false;
if (first.width < second.width) return true;
if (first.width > second.width) return false;
if (first.height < second.height) return true;
if (first.height > second.height) return false;
if (first.id < second.id) return true;
if (first.id > second.id) return false;
return false;
}
但我发现它具有与以下相同的效果:
bool SortRect(const Rect &first, const Rect &second)
{
return first.x < second.x;
}
如果SGI的文件是任何事情。较短,简单的排序谓词也应该起作用。我的测试证实了这一点(虽然我没有尝试所有可能的组合)。
答案 0 :(得分:5)
您还必须定义一个比较函数,sort()
应该使用它来对Rects进行排序。这个comparison function应该实现strict weak ordering,以便相等的元素在向量中彼此相邻。
如果矢量未排序,unique()
将找不到未排序的重复元素。
答案 1 :(得分:4)
为什么不首先使用std::set
?它的内容保证是独一无二的。
图片的标题说明:
你不需要在{+ 1}}中使用typedef
结构,只需struct Rect {};
即可
您的比较函数应该通过const-reference(即const Rect&
)获取其参数,因为它不需要修改它们,也不需要副本。
答案 2 :(得分:1)
sort(lala.begin(), lala.end());
std::sort
如何知道如何对Rect
进行排序?正常吗?定义比较函数并将其作为第三个参数传递,就像您对std::unique
所做的那样。必须将两个Rect
s作为参数,如果第一个是&lt;则返回true。第二个。
例如:
bool CompareRect(const Rect& first, const Rect& second) {
return first.id<second.id;
}
请注意,我将Rect
作为常量引用传递,您似乎已在样本中忘记了这一点。
答案 3 :(得分:0)
这就是我想出的:
我在排序函数中添加了一个谓词:
bool SortRect(const Rect &first, const Rect &second)
{
if (first.x < second.x) return true;
if (first.x > second.x) return false;
if (first.y < second.y) return true;
if (first.y > second.y) return false;
if (first.maxX < second.maxX) return true;
if (first.maxX > second.maxX) return false;
if (first.maxY < second.maxY) return true;
if (first.maxY > second.maxY) return false;
if (first.width < second.width) return true;
if (first.width > second.width) return false;
if (first.height < second.height) return true;
if (first.height > second.height) return false;
if (first.id < second.id) return true;
if (first.id > second.id) return false;
return false;
}
但我发现它具有与以下相同的效果:
bool SortRect(const Rect &first, const Rect &second)
{
return first.x < second.x;
}
所以它就像是说的那样,我只需要对第一个元素进行排序(使唯一函数正常工作)?
答案 4 :(得分:0)
我不确定你要实现什么,但一般来说,你需要设计你的矩形比较。是什么使一个矩形在序列中的另一个之前排序。
最简单的变体之一是在x坐标上进行比较。更复杂的选项是根据矩形计算的希尔伯特值进行排序。请参阅问题计算Hilbert value of a point for use in a Hilbert R-Tree?
也许您正在研究某种空间索引,然后了解R-tree