Максимум между int и long long int внутри функции std :: max VS '>' - PullRequest
2 голосов
/ 12 апреля 2020

У меня есть два вектора "a" и "b" из длинных длинных целых, и я w sh помещаю разность соответствующих элементов "a" и "b" в вектор "c". Но я не хочу, чтобы эти различия были go ниже 0.

#include<bits/stdc++.h>
using namespace std;

int main(){
    vector<long long int> a={360757931684,484141693549}; 
    vector<long long int> b={186119101678,675563431537};
    vector<long long int> c; 
    vector<long long int> d;

    for (int i=0; i<2; i++){
        // c.push_back(max(0,a[i]-b[i]));
        c.push_back(max(0ll,a[i]-b[i]));
        //I need to use "0ll" to make this work, Because the commented line above doesn't work
    }
    for (int i=0; i<2; i++){
        if (a[i]-b[i]>0)
            //Here this works fine even without "0ll"
            d.push_back(a[i]-b[i]);
        else
            d.push_back(0);
    }
    return 0;
}

При использовании функции std::max мне приходилось использовать 0ll, но при использовании оператора > с использованием только 0 было достаточно. Почему?

1 Ответ

3 голосов
/ 12 апреля 2020

Это потому, что std :: max должны быть заданы два параметра одного и того же типа, тогда как int и long long int - это два разных типа. Если вы напишите std::max(0, a[i]-b[i]), он не скомпилируется, потому что тип a[i]-b[i] равен long long int, а тип 0 равен int.

Более длинный ответ:

std::max - это шаблон функции. Используемая вами перегрузка имеет один шаблонный параметр T и два параметра const T& a и const T& b. Когда вы вызываете std::max, вы можете явно указать параметр шаблона следующим образом:

std::max<long long int>(0, a[i]-b[i])

В этом случае компилятор сгенерирует функцию, которая получит два long long int с, и вы можете на самом деле передать что угодно можно преобразовать в long long int функцию.

Однако, если вы не укажете параметр шаблона T, вычет аргумента шаблона попытается вывести его для вас.

Вот как это работает. Первый параметр - const T& a, поэтому компилятор пытается вывести T на основе того, что вы передали в качестве аргумента. Вы передаете 0, поэтому компилятор определяет, что T является int

Затем компилятор пытается вывести T, используя второй параметр const T& b. Вы передали long long int, поэтому компилятор определяет, что T должен быть long long int.

Затем компилятору не удается создать экземпляр шаблона функции, поскольку он вывел конфликтующие типы для того же параметра шаблона.

Если не создать экземпляр шаблона функции std::max с указанными аргументами, компилятор не может найти подходящую функцию для вызова, поэтому вы получаете ошибку компиляции.

...