Я пишу простую программу на 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
.
Есть способ решить это? Например, я думал преобразовать два вектора в целые числа и сравнить их, но не могу понять, как это сделать.
Хорошо, тогда лексикографическое сравнение не является желаемым действием. Есть ли другой способ сделать то, что я хочу?
да. Выполните сравнение вручную (преобразуйте вектор в целое число, затем сравните?)
Как прокомментировал @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
Добро пожаловать в @Tambuf, а также в Stack Overflow! Я включил полный рабочий пример, получайте удовольствие!
использование
<
с векторами приведет к лексикографическому сравнению. Не числовое сравнение. en.cppreference.com/w/cpp/container/vector/operator_cmp А поскольку "-19" лексикографически меньше, чем "-199", ну... вы увидите результаты, которые вы получите.