我正在做一个任务自动取款机。我应该在 STL 算法的帮助下比较给定范围内的所有向量元素,在两个不同的向量中,几乎相等。
在这种情况下几乎相等:2。
有人知道这个问题的解决方案吗?
如果您想要小于比较,请将std::lexicographical_compare与自定义比较器一起使用,以实现对您来说几乎相等的任何东西。
如果您想要相等比较,请使用std::equal,如评论中所指出的:
bool comp(int a, int b) {
return std::abs(a-b) <= 2;
}
int main() {
std::vector<int> v0{2,3,4,5,5,5};
std::vector<int> v1{6,7,8,9,8,7};
std::cout << std::boolalpha;
std::cout << std::equal(v0.begin(), v0.end(), v1.begin(), comp);
}
这是一个简化的比较函数,用于展示如何使用该算法,如果向量具有不同的长度,您必须决定该怎么做。
template<class iterator1, class iterator2>
bool almostEqual(iterator1 begin1, iterator1 end1,
iterator2 begin2, iterator2 end2, int tolerance)
{
for(;begin1!=end1; ++begin1, ++begin2) {
if (begin2 == end2)
return false;
if (*begin1 - tolerance > *begin2)
return false;
if (*begin1 + tolerance < *begin2)
return false;
}
if (begin2 != end2)
return false;
return true;
}
template<class container1, class container2>
bool almostEqual(container1 left, container2 right, int tolerance)
{
return almostEqual(left.begin(), left.end(),
right.begin(), right.end(), tolerance);
}
编译/执行证明:http: //ideone.com/y6jBR
标准库函数inner_product
迭代两个容器,对每一对执行一些操作,并累积结果。所以我们可以用它来比较每一对是否在2以内,并累加所有的比较都是真的。
#include <vector>
#include <iostream>
#include <algorithm>
bool all(bool first, bool second)
{
return first && second;
}
bool within_two(int first, int second)
{
return abs(first - second) <= 2;
}
int main()
{
using std::vector;
using std::inner_product;
using std::boolalpha;
using std::cout;
using std::endl;
vector<int> first = {1, 2, 3, 4, 5};
vector<int> second = {3, 4, 5, 6, 7};
bool almost_equal = inner_product(first.begin(), first.end(),
second.begin(),
true,
all, within_two);
cout << "almost_equal=" << boolalpha << almost_equal << endl;
}
输出:
almost_equal=true
#include "math.h"
#include <vector>
std::vector<int> vec1,vec2;
std::vector<bool> resVec;
void almostEqual(std::vector<int> vec1,std::vector<int> vec2,std::vector<bool>& resVec, int tolerance)
{
resVec.clear();
if (vec1.size() != vec2.size()) {return;}
std::vector<int>::iterator it;
int i = 0;
for (it = vec1.begin(); it != vec1.end(); ++it)
{
if (abs(*it - vec2[i++]) <= abs(tolerance))
{
resVec.push_back(true);
} else {
resVec.push_back(false);
}
}
}
基于我们所拥有的很少,这就是我要做的......