C++ 11 auto & range-like loop

静态类型,动态类型与类型推导

静态类型的类型检查发生在编译阶段,而动态类型(使用基类指针调用虚函数)的检查发生在运行阶段
类型推导,是由C++11引入的在编译阶段对变量类型的自动推导功能,即auto

auto 基本用法

auto是指示编译器根据变量值推断变量类型的占位符,用来避免复杂的变量初始化声明,如iterator
使用auto需要注意以下几点:

  • 使用auto声明的变量必须初始化,因为变量值是auto进行类型推断的依据。显然,函数和模板参数不可以声明为auto类型
  • auto仅为占位符,所以它不能用于类型转换,sizeof, typeid等需要获取变量类型的操作
  • 对于使用auto序列声明的变量,其初始值必须是相同类型,即一个auto占位符只会被推导为一个类型

Range-like loop

是传统遍历一个范围内的所有值的for循环的一个易读替换,可用于简化通过iterator操纵容器内元素的循环编写。

C++11标准下的语法:
for(范围声明: 范围表达式) { 循环声明 }

  • 范围声明:声明一个作为迭代器的变量,其变量类型与范围表达式返回的容器内的变量类型一致,或者是范围表达式返回的容器内的变量类型的引用,一般使用auto来简化
  • 范围表达式:一般是一个容器变量或返回一个容器的函数

代码样例:

#include <vector>
 
int main() {
    std::vector<int> v = {0, 1, 2, 3, 4, 5};
 
    for (const int& i : v) // 传const引用
        std::cout << i << ' ';
    std::cout << '\n';
 
    for (auto i : v) // 传递值
        std::cout << i << ' ';
    std::cout << '\n';
 
    for (auto&& i : v) // 传递引用
        std::cout << i << ' ';
    std::cout << '\n';
 
    const auto& cv = v;
 
    for (auto&& i : cv) // 传递const int&的引用
        std::cout << i << ' ';
    std::cout << '\n';
 
    for (int n : {0, 1, 2, 3, 4, 5}) // 使用花括号初始化的列表
        std::cout << n << ' ';
    std::cout << '\n';
 
    int a[] = {0, 1, 2, 3, 4, 5};
    for (int n : a) // the initializer may be an array
        std::cout << n << ' ';
    std::cout << '\n';
 
    for ([[maybe_unused]] int n : a)  
        std::cout << 1 << ' '; // the loop variable need not be used
    std::cout << '\n';
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值