C++ auto与循环
C++ auto 的介绍
typeid(p).name();可以输出auto的类型
auto
是 C++11 引入的一个关键字,用于自动类型推导。编译器会根据初始化表达式的类型来自动推导 auto
变量的类型。
使用 auto
可以简化代码,减少重复书写类型名称的繁琐,并且当类型非常复杂或者难以书写时,auto
尤其有用。
以下是 auto
的一些基本用法和注意事项:
- 基本用法:
auto x = 10; // x 是 int 类型
auto y = 3.14; // y 是 double 类型
auto str = "hello"; // str 是 const char[6] 类型
- 复杂类型的推导:
auto func = [](int a, int b) { return a + b; }; // func 是 lambda 表达式类型
- 引用类型的推导:
int a = 10;
auto& ref = a; // ref 是 int& 类型,引用到变量 a
ref = 20; // 修改 ref,a 的值也会被修改
- const 类型的推导:
const auto b = 20; // b 是 const int 类型
- auto 与指针:
auto ptr1 = &a; // ptr1 是 int* 类型
auto ptr2 = new int(30); // ptr2 是 int* 类型
- auto 与模板:
template<typename T>
void print(const T& value) {
auto copy = value; // 这里可以自动推导 copy 的类型
// ... 其他代码
}
- auto 与解构:
std::pair<int, double> p = {1, 3.14};
auto first = p.first; // first 是 int 类型
auto second = p.second; // second 是 double 类型
- auto 与 C++14 的 decltype 推导:
在 C++14 中,你可以使用decltype(auto)
来得到更加精确的推导结果。
decltype(auto) f() {
return std::make_pair(1, 3.14); // 返回类型是 std::pair<int, double>
}
注意事项:
- 使用
auto
时,初始化表达式必须是有效的,因为编译器需要根据它来推导类型。 auto
不能用于函数参数的类型推导,因为函数参数的类型必须在编译时就确定。auto
也不能用于类的成员变量的类型推导。
总之,auto
关键字为 C++ 编程提供了更多的灵活性和便利性,特别是在处理复杂类型或模板编程时。
auto在循环中的使用
vector<int> pm;
//传统循环
for(int i=0;i<pm.size();++i)
std::cout<<pm[i]<<'\';
//第一种循环
for(auto v: pm)
std::cout<<v<<'\';
//第二种循环采用引用,速度会更快,避免无意义的拷贝
for(auto& v: pm)
std::cout<<v<<'\';
//第三种循环,为了避免引用的时候不小心修改到数组内容,使用const引用
for(const auto& v: pm)
std::cout<<v<<'\';
上面三种的输出结果都是一样的,而且和传统的相比,速度效率更快。
我们如果想要让自定义容器也实现(auto v:pm)这种效果,我们需要在class中添加这些内容:
class MyVector{
public:
using GroupType = std::vector<int> ;
GroupType::iterator begin(){return m_group.begin();}
GroupType::iterator end(){return m_group.end();}
GroupType m_group;
};
只需要在class中添加一个begin和一个end函数即可。
这下即可使用:
MyVector m;
m.m_group.push_back(1);
m.m_group.push_back(2);
m.m_group.push_back(3);
m.m_group.push_back(4);
for(const auto& v:m)
std::cout<<v<<'\n';
标签:group,推导,int,auto,C++,循环,类型
From: https://www.cnblogs.com/AndreaDO/p/18033172