Как я могу правильно использовать операторы <и> для 2 векторов целых чисел, когда первый элемент обоих отрицателен? - PullRequest
4 голосов
/ 29 мая 2019

Я пишу простую программу на C ++ 17, которая сравнивает два вектора целых чисел.

например, у меня есть два вектора: a представляет число -1, b 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.

Есть способ решить это? Например, я думал о преобразовании двух векторов в целые числа и их сравнении, но я не могу понять, как это сделать.

1 Ответ

2 голосов
/ 29 мая 2019

Как прокомментировал @MPops, использование перегруженного оператора < с std::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
...