我有一些C ++对象,我想检查一些是否相同。
bool IsEqual(const Board& b)
{
if( b.From() != from_ )
return false;
if (b.To() != to_ )
return false;
if( b.Selection() != selection_ )
return false;
return true;
}
我的对象由一些整数(from_,to_,selection_)组成,该类提供了IsEqual方法来比较两个对象。
如果两个对象具有相同的值,则调用obj1.IsEqual(obj2)
将返回true。
但是如何比较N个对象?可以将push_back
个对象转换为std::vector<Board>
并使用std::unique
吗?
答案 0 :(得分:3)
将对象放入一组中。完成后,该集将仅包含唯一对象。
您可以在std::set
和std::unordered_set
之间进行选择,具体取决于您拥有的对象数量和比较功能的费用。
std::set
需要比较功能(operator<
)。 O(N * logN)复杂度。
std::unordered_set
需要散列和相等函数(std::equal_to
对您的对象进行2次const引用,std::hash
接受对象的const引用。 O(N)复杂性。
NB。双嵌套循环将是O(N 2 )复杂度。
NB2。 std::unique
要求对矢量进行排序,因为它只比较相邻的元素。
比较函数示例:
bool operator< (const Board& b) const {
if (from_ < b.from_)
return true;
if (from_ > b.from_)
return false;
if (to_ < b.to_)
return true;
if (to_ > b.to_)
return false;
if (selection_ < b.selection_)
return true;
return false;
}
答案 1 :(得分:1)
如果你创建了一个对象数组,然后运行一个简单的循环来比较它们
> board[n];
for(int i=0; i<n ; i++)
for(int j=i; j<n ; j++)
board[i].Isequal(board[j]);
您可以随时使用更有效的算法进行比较。
答案 2 :(得分:1)
您可以尝试如下家庭烹饪代码:
循环看起来像:
A[] arr = {a, b, c, d};
int counter = 0;
for (int i=0; i < arr.length -1 ; i++) {
for (int j=i+1; j < arr.length; j++) {
if (arr[i].IsEqual(arr[j])) counter++;
}
}
printf("There is %d objects that are equal", counter);
答案 3 :(得分:0)
是否可以将push_back对象转换为std :: vector并使用std :: unique?
是的,这是可能的,但这需要您先对矢量进行排序,然后使用与排序时相同的标准使用std::unique
。注意std::sort
和std::unqiue
需要严格的弱排序,如Compare概念中所述。您的IsEqual
函数不符合该要求。