AndreaDO

导航

C++ auto与循环

C++ auto与循环

C++ auto 的介绍

typeid(p).name();可以输出auto的类型

auto 是 C++11 引入的一个关键字,用于自动类型推导。编译器会根据初始化表达式的类型来自动推导 auto 变量的类型。

使用 auto 可以简化代码,减少重复书写类型名称的繁琐,并且当类型非常复杂或者难以书写时,auto 尤其有用。

以下是 auto 的一些基本用法和注意事项:

  1. 基本用法
auto x = 10;         // x 是 int 类型
auto y = 3.14;       // y 是 double 类型
auto str = "hello";  // str 是 const char[6] 类型
  1. 复杂类型的推导
auto func = [](int a, int b) { return a + b; };  // func 是 lambda 表达式类型
  1. 引用类型的推导
int a = 10;
auto& ref = a;  // ref 是 int& 类型,引用到变量 a
ref = 20;       // 修改 ref,a 的值也会被修改
  1. const 类型的推导
const auto b = 20;  // b 是 const int 类型
  1. auto 与指针
auto ptr1 = &a;     // ptr1 是 int* 类型
auto ptr2 = new int(30);  // ptr2 是 int* 类型
  1. auto 与模板
template<typename T>
void print(const T& value) {
    auto copy = value;  // 这里可以自动推导 copy 的类型
    // ... 其他代码
}
  1. auto 与解构
std::pair<int, double> p = {1, 3.14};
auto first = p.first;  // first 是 int 类型
auto second = p.second;  // second 是 double 类型
  1. 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';

posted on 2024-02-25 22:15  AndreaDO  阅读(114)  评论(0)    收藏  举报