有没有任何标准的算法来进行向量元素的成对比较
Is there any standard algorithm for doing pairwise comparison of Vector Elements?
我基本上有两个带有无序元素的向量,它们只能检查是否相等。有没有像std::equal这样的标准算法来比较所有n^2对,并检查一个向量的所有元素是否都在另一个向量中?
向量有多大?类似于:
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
之外的意义。)
对于较大的向量,最便宜的方法是对两者进行排序,然后测试相等
#include <vector>
#include <algorithm>
// ....
vector<yourType> v1;
vector<yourType> v2;
sort(v1);
sort(v2);
bool result = equal(begin(v1), end(v1), begin(v2));
假设您的矢量包含数据,这对于复制或交换来说是昂贵的:
#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;
}
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- C++:如何循环通过向量中的整数元素
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 不允许在向量中添加更多元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用并行参数向量调用元素向量的成员函数
- C++ 查找字符串中存在的元素向量
- 包含 std::threads 的元素向量
- 避免从单一元素向量转换为基元类型
- 对自定义元素向量进行排序时出现意外(至少对我来说)行为
- 如何为对元素(向量和int)配对创建unique_ptr也是unique_ptr
- 元素向量乘法 C++(代码不起作用)
- 时间和空间复杂性在二叉树的每个级别创建元素向量(NON-BST)
- 遍历结构元素向量
- 犰狳C++中的元素向量或矩阵乘法
- 为什么'std::vector<int> b{2};'创建 1 元素向量,而不是 2 元素向量?
- 可移动元素向量的大小调整是否有效?
- 唯一元素向量的c++模板函数
- 获取索引和元素-向量问题
- 定义一个生成元素向量的函数时,正确的方法是什么?