• auto关键字的妙用


    基本概念

    C++11中的auto关键字是C++语言的一个重大改进,它提供了一种类型推导的机制,允许开发者让编译器自动推导变量的类型,从而简化代码并提高可读性。

    常见使用场景

    1、循环中迭代变量的类型推导

    当处理容器或其他迭代器时,auto可以减少冗余的类型声明,使代码更加简洁。

    使用auto前

    1. std::vector<int> vec = {1, 2, 3, 4, 5};
    2. std::vector<int>::iterator it = vec.begin();
    3. for(; it != vec.end(); ++it)
    4. {
    5. std::cout << *it << " ";
    6. }

    使用auto后

    1. std::vector<int> vec = {1, 2, 3, 4, 5};
    2. for (auto it1 = vec.begin(); it1 != vec.end(); ++it1) {
    3. std::cout << *it1 << " ";
    4. }

    2、复杂类型初始化

    对于复杂类型,如函数指针、模板类型等,使用auto可以让代码更加清晰。

    使用auto前

    1. int (*func)(int, int) = [](int a, int b) { return a + b; };
    2. std::cout << "Result of lambda: " << func(10, 20) << std::endl;

    使用auto后

    1. // 使用auto简化复杂类型声明
    2. auto lambda = [](int a, int b) { return a + b; };
    3. std::cout << "Result of lambda: " << lambda(10, 20) << std::endl;

    3、与C++11新特性结合使用

    auto可以与std::tuplestd::function等C++11引入的类型结合使用,简化模板编程。

    使用auto前

    1. std::tuple<int, double, std::string> myTuple2(1, 2.0, "three");
    2. std::cout << "Tuple elements: " << std::get<0>(myTuple2) << ", " << std::get<1>(myTuple2) << ", " << std::get<2>(myTuple2) << std::endl;

    使用auto后

    1. // 使用auto与std::tuple结合
    2. auto myTuple = std::make_tuple(1, 2.0, "three");
    3. std::cout << "Tuple elements: " << std::get<0>(myTuple) << ", "
    4. << std::get<1>(myTuple) << ", " << std::get<2>(myTuple) << std::endl;

    4、根据初始化推断简单变量类型

    1. auto x = 10; // x的类型被推断为int
    2. auto y = 3.14; // y的类型被推断为double

    然而,这种使用auto也可能会导致代码的可读性降低,尤其是当初始化表达式的类型不是很容易理解时。因此,在使用auto时,最好保持代码的清晰和可读性,以上写法不太建议。

    完整示例demo

    1. #include
    2. #include
    3. #include
    4. int main() {
    5. // 使用auto推导迭代器类型
    6. std::vector<int> vec = {1, 2, 3, 4, 5};
    7. std::vector<int>::iterator it = vec.begin();
    8. for(; it != vec.end(); ++it)
    9. {
    10. std::cout << *it << " ";
    11. }
    12. std::cout << std::endl;
    13. for (auto it1 = vec.begin(); it1 != vec.end(); ++it1) {
    14. std::cout << *it1 << " ";
    15. }
    16. std::cout << std::endl;
    17. for(auto it2 : vec)
    18. {
    19. std::cout << it2 << " ";
    20. }
    21. std::cout << std::endl;
    22. // 使用auto简化复杂类型声明
    23. auto lambda = [](int a, int b) { return a + b; };
    24. std::cout << "Result of lambda: " << lambda(10, 20) << std::endl;
    25. int (*func)(int, int) = [](int a, int b) { return a + b; };
    26. std::cout << "Result of lambda: " << func(10, 20) << std::endl;
    27. // 使用auto与std::tuple结合
    28. auto myTuple = std::make_tuple(1, 2.0, "three");
    29. std::cout << "Tuple elements: " << std::get<0>(myTuple) << ", "
    30. << std::get<1>(myTuple) << ", " << std::get<2>(myTuple) << std::endl;
    31. std::tuple<int, double, std::string> myTuple2(1, 2.0, "three");
    32. std::cout << "Tuple elements: " << std::get<0>(myTuple2) << ", " << std::get<1>(myTuple2) << ", " << std::get<2>(myTuple2) << std::endl;
    33. return 0;
    34. }

  • 相关阅读:
    四、encoder与layout分析
    【学习笔记】Java 一对一培训(2.2)Java基础逻辑
    QCommandLineOption、QCommandLineParser
    CleanMyMac苹果电脑清理软件是智商税吗?最全评测价格、清理效果一次说清
    react数据管理之setState与Props
    Java IO 中的 FileInputStream 和 FileOutputStream
    手写模拟SpringBoot核心流程
    再见,CSDN
    全志T507 UART复用方法-飞凌嵌入式知识库
    自动化测试项目学习笔记(四):Pytest介绍和使用
  • 原文地址:https://blog.csdn.net/Jackie_Ryan/article/details/138171166