【问题标题】:Comparing iterators of arrays with same size比较具有相同大小的数组的迭代器
【发布时间】:2021-03-13 16:27:56
【问题描述】:

假设我有 2 个大小相同的数组:

std::array<int,3> a{2,4,8};
std::array<int,3> b{1,2,3};

我想知道a &gt; ba是否大于b,当且仅当a中某个索引i的每个元素都大于相同索引的元素在b

现在,我想使用迭代器来实现这个想法:

std::compare(a.begin(),a.end(),b.begin(),[&](const int& first,const int& second) {return first > second;}

我读过 std::lexicographical_compare 及其 _Compare 参数,但这种比较不符合我的目标。

有没有我写的比较功能?或者,我怎样才能创建自己的?

【问题讨论】:

  • 我不确定我是否理解,但你所描述的听起来确实像字典顺序。你能解释一下为什么std::lexicographical_compare 不是你想要的吗?也许添加示例。对于您问题中的两个数组,您期望 a &lt; b 得到什么结果?
  • 好的我现在明白这不是一个字典顺序,但仍然有一些例子有助于理解。也不清楚std::compare afaik 是什么意思,没有那个名字的标准算法
  • std::lexicographical_compare 失败,因为如果 a[0] &gt; b[0] 则返回 true,但它也应比较其他元素...
  • @largest_prime_is_463035818 我知道没有这个函数,但是我可以用其他函数实现还是自己写??
  • 据我了解您的比较,请注意,因为它似乎不尊重严格的弱排序。

标签: c++ arrays iterator compare predicate


【解决方案1】:

AFAIK,没有标准算法可以完全满足您的要求。因此,只需为它编写自己的函数,例如:

template <typename T, size_t N>
bool AreAllElementsGreaterThan(const std::array<T, N> &a, const std::array<T, N> &b)
{
    for(size_t i = 0 i < N; ++i)
    {
        if (a[i] <= b[i])
            return false;
    }
    return true;
}
std::array<int,3> a{2,4,8};
std::array<int,3> b{1,2,3};

if (AreAllElementsGreaterThan(a, b)) {
    cout << "a is greater than b";
} else {
    cout << "a is not greater than b";
}

if (AreAllElementsGreaterThan(b, a)) {
    cout << "b is greater than a";
} else {
    cout << "b is not greater than a";
}

【讨论】:

    【解决方案2】:

    正如评论中已经提到的,这里有一个警告:许多标准算法和容器都希望&lt; 实现strict weak ordering。如果您的比较没有做到这一点,并且您仍然将它用于此类算法和容器,您的代码将具有未定义的行为。

    话虽如此,算法并不是魔法,它们中的大多数只是一个简单的循环,这里不需要更多:

    #include <iostream>
    #include <array>
    
    template <typename IT>
    bool all_elems_compare_smaller(IT begin1,IT end1, IT begin2){
        for (; begin1 < end1;) {
            if (!(*begin1 < *begin2)) return false;
             ++begin1;
             ++begin2;
        }
        return true;
    }
    
    
    int main() {
        std::array<int,3> x{1,2,3};
        std::array<int,3> y{2,3,4};
        std::cout << all_elems_compare_smaller(x.begin(),x.end(),y.begin()) << "\n";
        std::cout << all_elems_compare_smaller(y.begin(),y.end(),x.begin()) << "\n";
    
    }
    

    请注意,为了简单起见,我没有费心允许自定义谓词,也没有考虑不同类型的迭代器的可能性。此外,我认为我实际上得到的比较并不完全像你要求的那样。我会留给你解决这个问题;)

    【讨论】:

      猜你喜欢
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      相关资源
      最近更新 更多