-4

我正在做一个任务自动取款机。我应该在 STL 算法的帮助下比较给定范围内的所有向量元素,在两个不同的向量中,几乎相等。

在这种情况下几乎相等:2。

有人知道这个问题的解决方案吗?

4

4 回答 4

4

如果您想要小于比较,请将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);

}

这是一个简化的比较函数,用于展示如何使用该算法,如果向量具有不同的长度,您必须决定该怎么做。

于 2012-04-23T19:24:33.170 回答
3

基于g19fanatic 的回答

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

于 2012-04-23T19:49:06.260 回答
0

标准库函数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
于 2012-04-23T20:03:33.747 回答
0
#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);
        }
    }
}

基于我们所拥有的很少,这就是我要做的......

于 2012-04-23T19:37:57.583 回答