gpt4 book ai didi

c++ - 如何删除结构 vector 的重复项 C++

转载 作者:行者123 更新时间:2023-12-05 09:32:34 24 4
gpt4 key购买 nike

我有 vector 运动

 vector<posToMove> movements;

posToMove 是一个结构体:

struct posToMove
{
int fromX;
int fromY;
int toX;
int toY;
};

我想删除移动中的重复项,我该怎么做?

最佳答案

最简单的方法是使用:

movements.erase(std::unique(movements.begin(), movements.end()), movements.end());

但是std::unique只删除连续 重复的元素,因此您需要对 std::vector 进行排序首先,通过重载 <==运算符(operator):

struct posToMove
{
int fromX;
int fromY;
int toX;
int toY;

bool operator < (const posToMove& other) const
{
//declare how 2 variable of type posToMove should be compared with <
return std::make_tuple(fromX, fromY, toX, toY) < std::make_tuple(other.fromX, other.fromY, other.toX, other.toY);
}

bool operator == (const posToMove& other) const
{
//declare how 2 variable of type posToMove should be compared with ==
return std::make_tuple(fromX, fromY, toX, toY) == std::make_tuple(other.fromX, other.fromY, other.toX, other.toY);
}
};

我声明了<==运算符 make_tuple() , 但您也可以将其替换为您选择的比较。

代码:

#include <iostream>
#include <vector>
#include <tuple>
#include <algorithm>
struct posToMove
{
int fromX;
int fromY;
int toX;
int toY;

bool operator < (const posToMove& other) const
{
//declare how 2 variable of type posToMove should be compared with <
return std::make_tuple(fromX, fromY, toX, toY) < std::make_tuple(other.fromX, other.fromY, other.toX, other.toY);
}

bool operator == (const posToMove& other) const
{
//declare how 2 variable of type posToMove should be compared with ==
return std::make_tuple(fromX, fromY, toX, toY) == std::make_tuple(other.fromX, other.fromY, other.toX, other.toY);
}
};

std::vector<posToMove>movements;

int main()
{
movements.push_back({0,1,0,0});
movements.push_back({1,2,5,7});
movements.push_back({3,9,9,6});
movements.push_back({0,1,0,0});
movements.push_back({4,1,8,0});
movements.push_back({1,2,5,7});

std::sort(movements.begin(), movements.end());

std::cout << "After sort : \n";
for (auto x : movements)
{
std::cout << x.fromX << " " << x.fromY << " " << x.toX << " " << x.toY << "\n";
}
std::cout << "\n";

movements.erase(std::unique(movements.begin(), movements.end()), movements.end());

std::cout << "After removing : \n";
for (auto x : movements)
{
std::cout << x.fromX << " " << x.fromY << " " << x.toX << " " << x.toY << "\n";
}
}

结果:

After sort :
0 1 0 0
0 1 0 0
1 2 5 7
1 2 5 7
3 9 9 6
4 1 8 0

After removing :
0 1 0 0
1 2 5 7
3 9 9 6
4 1 8 0

相关:Remove duplicates in vector of structure c++

文档:

关于c++ - 如何删除结构 vector 的重复项 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67929680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com