C++ 中用于类型推断的 auto 关键字
Suraj P
2023年10月12日
-
C++ 中的
auto
关键字 -
在 C++ 中将
auto
与函数一起使用 -
在 C++ 中对变量使用
auto
-
在 C++ 中将
auto
与迭代器一起使用 -
在 C++ 中将
auto
与函数参数一起使用 -
在 C++ 中使用
auto
关键字的错误 - 结论
本教程将解决 C++ 11 中引入的 auto
关键字。我们将查看不同的示例以了解其用例和使用时的常见错误。
C++ 中的 auto
关键字
C++ 11 版本中的关键字 auto
是 Type inference
功能的一部分。类型推断是指在编译时推断函数或变量的数据类型。
所以我们不必指定数据类型编译器可以在编译时自动推断它。return 语句帮助我们推断函数的返回数据类型。
而在变量的情况下,初始化有助于确定数据类型。
在 C++ 中将 auto
与函数一起使用
#include <iostream>
using namespace std;
auto division() {
double a = 55.0;
double b = 6.0;
double ans = a / b;
return ans;
}
int main() { cout << division(); }
输出:
9.16667
这里的 return 语句帮助编译器推断我们的 division()
函数的返回类型。由于函数返回双精度类型 ans
,编译器推断 auto
必须由双精度类型替换。
在 C++ 中对变量使用 auto
#include <iostream>
#include <typeinfo>
using namespace std;
int main() {
auto x = 10;
auto y = 10.4;
auto z = "iron man";
cout << x << endl;
cout << y << endl;
cout << z << endl;
}
输出:
10
10.4
iron man
基于语句的右侧,也称为 initializers
,编译器推断变量的类型。
在 C++ 中将 auto
与迭代器一起使用
在处理向量、集合或映射等 STL 容器时,auto
关键字被高度用于迭代它们。我们可以通过跳过冗长的迭代器声明来最小化时间损失。
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> v{22, 14, 15, 16};
vector<int>::iterator it = v.begin(); // without auto
auto it2 = v.begin();
while (it2 != v.end()) {
cout << *it2 << " ";
it2++;
}
cout << endl;
map<int, int> mp;
mp.insert(pair<int, int>(1, 40));
mp.insert(pair<int, int>(2, 30));
mp.insert(pair<int, int>(3, 60));
mp.insert(pair<int, int>(4, 20));
map<int, int>::iterator vt = mp.begin(); // without auto
auto vt2 = mp.begin();
while (vt2 != mp.end()) {
cout << vt2->first << " -> " << vt2->second << endl;
vt2++;
}
cout << endl;
}
输出:
22 14 15 16
1 -> 40
2 -> 30
3 -> 60
4 -> 20
我们观察使用 auto
和不使用之间的区别。如果没有 auto
,我们必须明确指定迭代器的类型,这很乏味,因为语句很长。
在 C++ 中将 auto
与函数参数一起使用
在 C++ 中,我们必须每次都指定函数参数,但这可以通过使用 auto
来简化。
#include <bits/stdc++.h>
using namespace std;
void myfunc(auto x, auto str) { cout << x << " " << str << endl; }
int main() {
int x = 10;
string str = "Iron Man";
myfunc(x, str);
}
输出:
10 Iron Man
数据类型的推断发生在函数调用期间。因此,会发生变量匹配,并且编译器会计算出所有参数的确切数据类型。
在 C++ 中使用 auto
关键字的错误
整数与布尔混淆
在 C++ 中,我们知道布尔值被初始化为 0
或 1
。现在,这可能会在调试时造成一些混乱。
#include <bits/stdc++.h>
using namespace std;
int main() { auto temp = 0; }
使用 auto
关键字的多个声明
我们一次性声明变量以节省时间,但如果两者的类型不同,这可能会产生问题。
#include <bits/stdc++.h>
using namespace std;
int main() { auto x = 10, y = 35.66; }
输出:
[Error] inconsistent deduction for 'auto': 'int' and then 'double'
当我们在编译器中编译上面的代码时,我们会得到一个错误,这是因为编译器被混淆了。
结论
我们了解到,auto
关键字节省了大量编写基本代码的时间,专注于程序中更密集和更复杂的部分。虽然非常有用,但我们必须小心使用它。