Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何有效地从vector中删除重复的用户定义数据?_C++_Vector - Fatal编程技术网

C++ 如何有效地从vector中删除重复的用户定义数据?

C++ 如何有效地从vector中删除重复的用户定义数据?,c++,vector,C++,Vector,让我们定义一个简单的结构a struct A { int x,y,z; }; 我想通过以下规则从vector中删除一些元素 if two compared segments' x is same, remove one which has larger y value. [before remove] x y z 1 2 3 1 3 4 1 4 5 [after remove] x y z 1 2 3 另一个规则 if two compared segment's x and y

让我们定义一个简单的结构a

struct A
{
   int x,y,z;
};
我想通过以下规则从vector中删除一些元素

if two compared segments' x is same, remove one which has larger y value.

[before remove]
x y z
1 2 3
1 3 4 
1 4 5

[after remove]
x y z
1 2 3
另一个规则

if two compared segment's x and y values are same, remove one which has smaller z value.
[before remove]
x y z
1 2 3
1 2 4
1 2 5

[after remove]
1 2 5
我在STL中使用了unique和erase函数来解决这个问题。。如下

bool compare_x(const A & p1, const A & p2)
{
    if(p1.x == p2.x) // to erase larger one.
        return p1.y < p2.y
}


...
vector<A> list; // let's assume that this vector has some data.

list.erase(unique(list.begin(), list.end(), compare_x), list.end());


bool比较(常数A和p1,常数A和p2)
{
if(p1.x==p2.x)//删除较大的一个。
返回p1.y
但是有人对我说,独特的功能不好用

所以我想知道任何可以解决这类问题的技术或功能


谢谢。

为了删除所有重复项,指定给
std::unique
的范围内的所有重复元素必须彼此相邻。元素的排序顺序会影响哪些重复项不会被删除。因此,正确的解决方案是
std::sort
std::unique
erase

其次,
compare\ux
是假的。在case
p1.x!=p2.x
。这种行为没有定义。此外,谓词不能告诉算法要删除哪个等效元素;它告诉算法哪些元素是等价的。删除哪个元素取决于它们在输入范围中的位置。保留第一个等效元素

该问题的解决方案在于使用不同的谓词来表示sort和unique。Unique需要更宽松的条件,而排序需要具有相同的条件,除非在相同的情况下,它应该进行排序,以便删除正确的元素

如果两个比较段的x相同,则删除一个y值较大的段

唯一谓词:仅通过
x

排序谓词:按
x
,然后按
y
<代码>y
必须按升序排序

如果两个比较段的x和y值相同,请删除z值较小的一个

唯一谓词:通过
x
y


排序谓词:按
x
y
,然后按
z
z
必须按降序排序。

您应该显示您尝试过的内容,以及不起作用的内容。许多人说了很多话,但如果您的代码按预期工作,可能他们是错的。为什么您认为您的方法有问题?这个实现没有问题。我收回了之前的评论,因为在这种情况下,“擦除-删除”习惯用法不起作用。您已经拥有的独特擦除功能工作正常。为什么std::unique不起作用?