我有两个长整数的向量"a“和"b”,我想把"a“和"b”各自元素的差异放到一个向量"c“中。但我不希望这些差值低于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就足够了。为什么?
发布于 2020-04-12 18:55:20
这是因为必须为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,template argument deduction会尝试为您推断它。
下面是它的工作原理。第一个参数是const T& a,因此编译器尝试根据您作为参数传递的内容来推断T。您传递了0,因此编译器推断出T是一个int
然后,编译器尝试使用第二个参数const T& b来推导T。您传递了一个long long int,所以编译器推断T一定是一个long long int。
然后,编译器无法实例化函数模板,因为它推导出同一模板参数的冲突类型。
无法使用指定的参数实例化函数模板std::max,编译器无法找到要调用的匹配函数,这就是为什么会出现编译错误。
https://stackoverflow.com/questions/61170115
复制相似问题