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

Pro*_*mer 13 c++ size vector c++11

我们有两个大小的向量取决于运行时间,需要检查它们是否相等 - 仅在较小大小的向量结束后才有不同的元素.我使用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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Nel*_*eal 23

从C++ 14开始,您可以使用std::mismatch并检查在每个范围的末尾返回的迭代器对:

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

你也可以知道元素开始不同的地方,如果它们没有,那么更大的向量就越大(你不想比较的子范围的开始).

  • OP在单个算法中想要的确切语义信息.+1 (3认同)
  • 非常好.我不知道这个算法存在.+1 (2认同)

Bla*_*aze 8

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;
}
Run Code Online (Sandbox Code Playgroud)

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

std::cout << "Same " << ((a.size() == a1.size())? "a = a1" : ((a.size() > a1.size())? "a gt a1" : "a1 gt a")) << std::endl;
Run Code Online (Sandbox Code Playgroud)

  • 我建议使用`const auto size = std :: min(a.size(),a1.size());`.这也不会执行无符号签名转换. (2认同)