代码之家  ›  专栏  ›  技术社区  ›  Programmer

将较小的向量与较大的向量进行比较,以检查较小向量末尾的向量是否不同

  •  13
  • Programmer  · 技术社区  · 7 年前

    我们有两个大小的向量,这取决于运行时,需要检查它们是否相等-只有在较小大小的向量结束后才有不同的元素。我使用了std::equal,但问题是我需要首先找到哪个向量的大小较小,从而导致额外的代码行:

    #include <vector>
    #include <iostream>
    
    int main()
    {
      std::vector<int> a(1000, 3);
      std::vector<int> a1(100, 3);
    
      if(a.size() > a1.size())
      {
        if(std::equal(a1.begin(), a1.end(), a.begin()))
        {
          std::cout << "Same a gt a1" << std::endl;
        }
      }
    
      if(a1.size() > a.size())
      {
        if(std::equal(a.begin(), a.end(), a1.begin()))
        {
          std::cout << "Same a1 gt a" << std::endl;
        }
      }
    
      if(a1.size() == a.size())
      {
        if(std::equal(a.begin(), a.end(), a1.begin()))
        {
           std::cout << "Same a = a1" << std::endl;
        }
      }
    }
    

    比较两个向量或仅在较小向量末尾不同的代码是否可以改进?

    3 回复  |  直到 6 年前
        1
  •  23
  •   Nelfeal    7 年前

    std::mismatch 并根据每个范围的末尾检查返回的迭代器对:

    auto it = std::mismatch(a.begin(), a.end(), a1.begin(), a1.end());
    if (it.first == a.end() || it.second == a1.end()) {
        // Equality
    }
    

    您还可以知道元素在哪里开始不同,如果它们不不同,那么在哪一点上向量越大(您不想比较的子范围的开始)。

        2
  •  8
  •   Blaze    7 年前

    std::equal 如果事先计算较小的尺寸。我会像这样重构代码:

    #include <vector>
    #include <iostream>
    #include <algorithm>
    
    int main()
    {
        std::vector<int> a(1000, 3);
        std::vector<int> a1(100, 3);
    
        if (std::equal(a1.begin(), a1.begin() + std::min(a.size(), a1.size()), a.begin())) 
        {
            std::cout << "Same" << std::endl;
        }
        return 0;
    }
    

    如果需要保留关于哪个向量更大的第二个信息,可以这样实现,例如:

    std::cout << "Same " << ((a.size() == a1.size())? "a = a1" : ((a.size() > a1.size())? "a gt a1" : "a1 gt a")) << std::endl;
    
        3
  •  0
  •   lubgr    7 年前

    下面是一个纯C++11解决方案,它应该适用于任何顺序容器(例如。 std::vector , std::list , std::deque

    enum class CombinedCompareResult {
       NotEqual, EqualAndFirstLarger, EqualAndSecondLarger, EqualIncludingSize
    };
    
    template <class Rng1, class Rng2>
    CombinedCompareResult combinedCompare(const Rng1& rng1, const Rng2& rng2)
    {
       using std::begin;
    
       const auto elementsToCompare = std::min(rng1.size(), rng2.size());
    
       if (!std::equal(begin(rng1), std::next(begin(rng1), elementsToCompare), begin(rng2)))
          return CombinedCompareResult::NotEqual;
       else if (rng1.size() == rng2.size())
          return CombinedCompareResult::EqualIncludingSize;
       else if (rng1.size() > rng2.size())
          return CombinedCompareResult::EqualAndFirstLarger;
       else
          return CombinedCompareResult::EqualAndSecondLarger;
    }
    

    这可以像下面那样使用,并且应该导致与问题中的代码相同的行为。

    const auto cmp = combinedCompare(lst, a);
    
    if (cmp == CombinedCompareResult::EqualIncludingSize)
        std::cout << "Same a = a1" << std::endl;
    else if (cmp == CombinedCompareResult::EqualAndFirstLarger)
        std::cout << "Same a gt a1" << std::endl;
    else if (cmp == CombinedCompareResult::EqualAndSecondLarger)
        std::cout << "Same a1 gt a" << std::endl;