C++ c++;与其他变量的参考变速差
如果我使用引用变量C++ c++;与其他变量的参考变速差,c++,reference,C++,Reference,如果我使用引用变量 int &ret = buffer[balance]; #define INF 123456789 int coins[100]; // 사용가능한 동전들 int n; // 동전 가짓수 int k; // 총 합 int buffer[10001]; // 금액에 맞는 최소값 int check(int balance) { if (balance < 0) return INF; if (balance ==
int &ret = buffer[balance];
#define INF 123456789
int coins[100]; // 사용가능한 동전들
int n; // 동전 가짓수
int k; // 총 합
int buffer[10001]; // 금액에 맞는 최소값
int check(int balance) {
if (balance < 0)
return INF;
if (balance == 0)
return 0;
int &ret = buffer[balance];
if (ret != -1)
return ret;
ret = INF;
// 가능한 모든 코인에 대해서 반복
for (int i = 0; i < n; i++) {
ret = min(check(balance - coins[i]) + 1, ret);
}
return ret;
}
int main() {
// initialization
memset(buffer, -1, sizeof(buffer));
cin >> n >> k;
for (int i = 0; i < n; i++) {
scanf_s("%d", &coins[i]);
}
int ret = check(k);
if (ret == 0 || ret == INF)
ret = -1;
cout << ret << endl;
return 0;
}
在解决在线判断问题时,不会出现超时(限制:2s)
当我使用一般变量时
int ret = buffer[balance];
超时发生了,我想知道为什么
这是我使用引用变量的代码
int &ret = buffer[balance];
#define INF 123456789
int coins[100]; // 사용가능한 동전들
int n; // 동전 가짓수
int k; // 총 합
int buffer[10001]; // 금액에 맞는 최소값
int check(int balance) {
if (balance < 0)
return INF;
if (balance == 0)
return 0;
int &ret = buffer[balance];
if (ret != -1)
return ret;
ret = INF;
// 가능한 모든 코인에 대해서 반복
for (int i = 0; i < n; i++) {
ret = min(check(balance - coins[i]) + 1, ret);
}
return ret;
}
int main() {
// initialization
memset(buffer, -1, sizeof(buffer));
cin >> n >> k;
for (int i = 0; i < n; i++) {
scanf_s("%d", &coins[i]);
}
int ret = check(k);
if (ret == 0 || ret == INF)
ret = -1;
cout << ret << endl;
return 0;
}
#定义INF 123456789
整数硬币[100];//사용가능한 동전들
int n;//동전 가짓수
int k;//총 합
int缓冲区[10001];//금액에 맞는 최소값
整数支票(整数余额){
如果(余额<0)
返回INF;
如果(余额==0)
返回0;
int&ret=缓冲区[余额];
如果(ret!=-1)
返回ret;
ret=INF;
// 가능한 모든 코인에 대해서 반복
对于(int i=0;i>n>>k;
对于(int i=0;i>k;
对于(int i=0;i cout当ret
是一个引用时,您正在通过该引用修改数组,并且您的代码相当于
int check(int balance) {
if (balance < 0)
return INF;
if (balance == 0)
return 0;
if (buffer[balance] != -1)
return buffer[balance];
buffer[balance] = INF;
for (int i = 0; i < n; i++) {
buffer[balance] = min(check(balance - coins[i]) + 1, buffer[balance]);
}
return buffer[balance];
}
int检查(int余额){
如果(余额<0)
返回INF;
如果(余额==0)
返回0;
如果(缓冲区[余额]!=-1)
返回缓冲区[余额];
缓冲区[余额]=INF;
对于(int i=0;i
如果ret
不是引用,则永远不会更新数组,因此ret!=-1
永远不会为真。使用引用时,将使用同一堆对象。
我已经为您制作了一个快速的drow,让您了解参考资料的外观:
如果您想了解更多信息,请阅读本文:,因为当您不使用引用时,代码将完全不做任何事情,并且将一直不做任何事情直到时间结束。因此超时。无需深入研究生成的程序集。它与微级优化无关,但这一事实极大地改变了程序的逻辑。引用与…非引用有着根本的不同。当你使用引用时,你的代码正在做一些完全不同的事情。当你使用引用时,你正在通过引用ret
修改缓冲区的内容。另一方面,如果ret
是一个值,那么该函数不会修改缓冲区的内容。这可能解释了不同的运行时,尽管我不明白什么是缓冲区
的好开始with@user463035818哦,对不起,我刚刚编辑了我的question@SamVarshavchik谢谢
int check(int balance) {
if (balance < 0)
return INF;
if (balance == 0)
return 0;
if (buffer[balance] != -1)
return buffer[balance];
buffer[balance] = INF;
for (int i = 0; i < n; i++) {
buffer[balance] = min(check(balance - coins[i]) + 1, buffer[balance]);
}
return buffer[balance];
}