是否有任何标准算法进行矢量元素的成对比较?

时间:2013-08-28 11:52:54

标签: c++ c++11

我基本上有两个带有无序元素的向量,只能检查它们是否相等。是否有像std :: equal这样的标准算法比较所有n ^ 2对并检查一个向量的所有元素是否位于另一个向量中?

3 个答案:

答案 0 :(得分:4)

载体有多大?类似的东西:

template <typename T>
bool
unorderedEqual( std::vector<T> const& v1, std::vector<T> const& v2 )
{
    return v1.size() == v2.size()
        && std::find_if(
            v1.begin(), v1.end(),
            [&v2]( T const& elem ) { 
                return std::find( v2.begin(), v2.end(), elem ) == v2.end();
            } ) == v1.end();
}

可能会做到这一点,但它是O(n ^ 2)(这意味着它只是好的 对于非常小的向量),如果向量,它将不起作用 包含重复元素。 (另请注意,我没有测试过, 所以它可能包含拼写错误和其他错误。但它应该 足够接近,给出一般的想法。)

否则,我认为你必须排序;即使是对象 不支持不到,你应该能够定义一个 订购功能。 (订单可以是任意的,没有 重要性除了允许使用std::sort。)

答案 1 :(得分:2)

较大的向量的最便宜的方式最有可能对两者进行排序,然后测试相等性

#include <vector>
#include <algorithm>

// ....

vector<yourType> v1;
vector<yourType> v2;

sort(v1);
sort(v2);
bool result = equal(begin(v1), end(v1), begin(v2));

答案 2 :(得分:0)

假设您的向量包含复制或交换成本昂贵的数据:

#include <algorithm>
#include <iostream>
#include <vector>
#include <unordered_set>

typedef std::vector<std::size_t> Index;
typedef std::vector<int> Data;
inline void init(Index& index, const Data& data) {

    struct Less
    {
        const Data& data;

        Less(const Data& data)
        :   data(data)
        {}

        bool operator () (std::size_t a, std::size_t b) {
            return data[a] < data[b];
        }
    };

    index.reserve(data.size());
    for(size_t i = 0; i < data.size(); ++i) {
        index.push_back(i);
    }
    Less less(data);
    std::sort(index.begin(), index.end(), less);
}

int main(){

    Data d0 { 1, 0, 4, 2, 5, 3 };
    Data d1 { 5, 2, 3, 0, 4, 1 };

    if(d0.size() == d1.size()) {
        Index i0;
        Index i1;
        init(i0, d0);
        init(i1, d1);
        for(std::size_t i = 0; i < d0.size(); ++i) {
            std::cout << d0[i0[i]] << " == " << d1[i1[i]] << std::endl;
            if(d0[i0[i]] != d1[i1[i]]) {
                std::cout << "Not equal" << std::endl;
                return 1;
            }
        }
    }
    std::cout << "Equal" << std::endl;
    return 0;
}