【发布时间】:2015-05-21 07:19:46
【问题描述】:
假设元素的顺序不同,我想将向量与数组进行比较。 我有一个如下结构:
struct A
{
int index;
A() : index(0) {}
};
向量和数组的大小是一样的:
std::vector<A> l_v = {A(1), A(2), A(3)};
A l_a[3] = {A(3), A(1), A(2)};
比较元素的函数是:
bool isTheSame()
{
return std::equal(l_v.begin(), l_v.end(), l_a,
[](const A& lhs, const A& rhs){
return lhs.index == rhs.index;
});
}
问题是我的函数会返回false,因为元素相同,但顺序不同。 一个解决方案是对vector和array中的元素在“std::equal”之前进行排序,但是有没有更好的解决方案?
【问题讨论】:
-
如果索引范围很小,您可以使用类似于counting sort 的算法来获得
O(N)算法而不是O(log N)。 -
不,您必须对两个数组进行排序。一旦你这样做了,你就可以在向量本身上使用 operator==。
-
对数组排序?或者为每个元素创建一个数组,并计算你在另一个集合中看到一个元素的次数。
-
如果其中一个数组已经排序,您可以比排序+比较做得更好,只需使用二进制搜索在排序数组中搜索未排序数组的所有元素。那将是 O(log(n)*n) 而不是 O(log(n)*n + n) (是的,我知道,它都是相同的 Big-O,但第一个仍然更快)。
标签: c++ arrays vector compare equals