让我们定义一个简单的结构A.
结构A.{ int x,y,z;};我想按照规则从vector中删除一些元素。
如果两个比较的段’x相同,则删除一个y值较大的段。
…
为了删除所有重复项,给出的范围 std::unique 必须具有彼此相邻的所有重复元素。元素排序的顺序会影响哪些副本不会被删除。所以,正确的解决方案是 std::sort , std::unique , erase 。
std::unique
std::sort
erase
其次, compare_x 是虚假的。它缺少一个返回声明以防万一 p1.x != p2.x 。行为未定义。此外,谓词不能告诉算法要删除哪个等效元素;它告诉算法哪些元素是等价的。擦除哪个元素取决于它们在输入范围中的位置。保留第一个等效元素。
compare_x
p1.x != p2.x
该问题的解决方案在于使用不同的谓词进行排序和唯一。独特需要一个更宽松的标准,而排序需要具有相同的标准,除非在相同的情况下,它应该排序,以便删除正确的元素。
如果两个比较的段'x相同,则删除一个y值较大的段。
唯一谓词:仅限于 x 。
x
排序谓词:By x , 然后 y 。 y 必须按升序排序。
y
如果两个比较的段的x和y值相同,则删除一个z值较小的值。
唯一谓词:By x 和 y 。
排序谓词:By x 和 y 然后是 z 。 z 必须按降序排序。
z