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