首页 > 解决方案 > 当两个整数的第一个元素都是负数时,如何正确使用 < 和 > 运算符来处理 2 个整数向量?

问题描述

我正在编写一个简单的 C++17 程序来比较两个整数向量。

例如,我有两个向量:a代表数字b-1、25

std::vector<int> a = {-1};
std::vector<int> b = {2, 5};
if(a < b)       std::cout << "a < b" << std::endl;
else if(a > b)  std::cout << "a > b" << std::endl;
else            std::cout << "a = b" << std::endl;

上一段代码产生的输出是a < b,而且是正确的。现在让我们考虑以下示例:

std::vector<int> a = {-1, 9};
std::vector<int> b = {-1, 9, 9};
if(a < b)       std::cout << "a < b" << std::endl;
else if(a > b)  std::cout << "a > b" << std::endl;
else            std::cout << "a = b" << std::endl;

这里的输出也是a < b如此,但由于 -19 > -199 我希望它是a > b.

有办法解决这个问题吗?例如,我想将两个向量转换为整数并进行比较,但我不知道该怎么做。

标签: c++sortingvectoroperator-overloading

解决方案


正如@MPops 评论的那样,使用重载运算符<withstd::vector将进行字典比较,这不是您想要的(数字比较)。

参考资料中阅读更多内容。

您需要手动对两个向量进行数值比较,方法是将 转换vector<int>int,如下所示:

#include <iostream>
#include <vector>

template <typename T> int sgn(T val) {
    return (T(0) < val) - (val < T(0));
}

int vectorToInt(std::vector<int> v) {
  int result = 0;
  if(!v.size()) return result;
  result = result * 10 + v[0];
  for (size_t i = 1; i < v.size(); ++i) {
    result = result * 10 + (v[i] * sgn(v[0]));
  }
  return result;
}

int main(void) {
  std::vector<int> a_vec = {-1, 9};
  int a = vectorToInt(a_vec);
  std::vector<int> b_vec = {-1, 9, 9};
  int b = vectorToInt(b_vec);
  std::cout << "Comparing " << a << " with " << b << std::endl;

  if(a < b)       std::cout << "a < b" << std::endl;
  else if(a > b)  std::cout << "a > b" << std::endl;
  else            std::cout << "a = b" << std::endl;
  return 0;
}

输出:

Comparing -19 with -199
a > b

推荐阅读