C++ 如何有效地从vector中删除重复的用户定义数据?
让我们定义一个简单的结构aC++ 如何有效地从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
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
是假的。在casep1.x!=p2.x
。这种行为没有定义。此外,谓词不能告诉算法要删除哪个等效元素;它告诉算法哪些元素是等价的。删除哪个元素取决于它们在输入范围中的位置。保留第一个等效元素
该问题的解决方案在于使用不同的谓词来表示sort和unique。Unique需要更宽松的条件,而排序需要具有相同的条件,除非在相同的情况下,它应该进行排序,以便删除正确的元素
如果两个比较段的x相同,则删除一个y值较大的段
唯一谓词:仅通过x
排序谓词:按x
,然后按y
<代码>y必须按升序排序
如果两个比较段的x和y值相同,请删除z值较小的一个
唯一谓词:通过x
和y
排序谓词:按
x
和y
,然后按z
z
必须按降序排序。您应该显示您尝试过的内容,以及不起作用的内容。许多人说了很多话,但如果您的代码按预期工作,可能他们是错的。为什么您认为您的方法有问题?这个实现没有问题。我收回了之前的评论,因为在这种情况下,“擦除-删除”习惯用法不起作用。您已经拥有的独特擦除功能工作正常。为什么std::unique不起作用?