【问题标题】:Comparing a vector with an array assuming the elements are in different order假设元素的顺序不同,将向量与数组进行比较
【发布时间】: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


【解决方案1】:

使用排序将是要走的路。一般排序是good idea。据我所知,它会带来最好的性能。

注意:我建议将向量作为参数传递。而不是使用成员变量。这样做之后,这将是一个非常适合内联的典型函数。此外,您可能还需要考虑将其从课程中移除和/或使其成为静态。

【讨论】:

    猜你喜欢
    • 2017-05-31
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2020-03-06
    • 2012-10-18
    相关资源
    最近更新 更多