当前位置: 首页 > 知识库问答 >
问题:

比较较小的矢量和较大的,以检查它是否在较小的末端不同

傅旺
2023-03-14

我们有两个大小的向量,这取决于运行时,需要检查它们是否相等-只有在较小大小的向量结束后才有不同的元素。我使用了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个答案

萧晓博
2023-03-14

下面是一个纯C 11解决方案,它应该适用于任何顺序容器(例如,std::vectorstd::liststd::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;
葛学民
2023-03-14

如果预先计算较小的大小,则只需调用一次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;
百里朝
2023-03-14

从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
}

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

 类似资料:
  • 我有一个关于compareTo函数如何帮助比较器排序的问题,即o1。比较(o2)与o2。比较(o1) 如果两个字符串相等,则此方法返回0,否则返回正值或负值。如果第一个字符串在词典上大于第二个字符串,则结果为正,否则结果为负。 上面的陈述很简单,但是为什么o1.compare(o2)会给我一个升序,而o2.compare(o1)给了我一个降序? 如果我有整数值“5,10,3”,我得到3,5,10和

  • git show git show 命令可以以一种简单的人类可读的方式来显示一个 Git 对象。 你一般使用此命令来显示一个标签或一个提交的信息。 我们在 附注标签 一节中使用此命令来显示带注解标签的信息。 然后,我们在 选择修订版本 一节中,用了很多次来显示不同的版本选择将解析出来的提交。 我们使用 git show 做的最有意思的事情是在 手动文件再合并 一节中用来在合并冲突的多个暂存区域中提

  • 现在你有了一堆分支,短期的主题、长期的特性或者其它。怎样追踪他们呢?Git 有一组工具,可以帮助你弄明白工作是在哪儿完成的,两个分支间的区别是啥,等等。 简而言之 执行 git log 找到你的项目历史中的特定提交 ——按作者、日期、内容或者历史记录。执行 git diff 比较历史记录中的两个不同的点 ——通常是为了看看两个分支有啥区别,或者从某个版本到另一个版本,你的软件都有啥变化。 git

  • 每次我启动Android模拟器在Android Studio模拟器需要整个监视器。我可以以某种方式要求Android Studio规模模拟器窗口50%? 如何做到这一点?

  • 问题内容: 这样做的目的是从用户那里获得一个句子并确定每个元音中出现了多少个。大部分是完成的,除了我不确定如何忽略大写和小写字母外,但我猜是equalsIgnoreCase或toUpperCase()。 我想也知道,如果有另一种方式做到这一点使用的一些其他类,或。我仍然是编程的新手,这一章让我丧命。 } 这里的代码 问题答案: 由于您正在比较原始字符, 应该已经是您使用Java的最佳方式。 但是,

  • 问题内容: 我建立了一个网站,问题是Chrome的显示尺寸大于Firefox。我尝试了几种匹配字体大小的方法,以px为单位指定字体,以%设置正文为100%,然后将元素设置为。这些都不起作用。静止图像显示的铬要大1个像素。 这是我用于字体大小的代码: 在#geral包裹整个站点的地方,而CSS上没有其他font-size语句,可以在我发布的链接中查看源代码。 我想知道是否有一种方法可以解决此问题,或