嵌入式AI学习打卡 04 现代C++ 基于范围的for循环

71 阅读2分钟

适合谁看:资深的嵌入式系统底层专家。技能栈(C、SoC、Bootloader、驱动、系统移植、DSP优化、Cache调优、功耗分析)是芯片设计的核心和基础,具备从硬件(SoC)底层固件(ROM Bootloader)再到操作系统层(驱动、RTOS)的全栈知识和实战经验,希望向嵌入式场景的AI部署方向拓展,寻求新的发展空间。


AI应用很多都是C++开发的,所以还得把C++的耳朵捡起来。直接用微软文档学吧,大概看看,其实主要是《essenstial c++》那些东西,类、容器、算法、模板,时至今日已经到处都是了,并不新鲜。主要是复习,熟悉一些现代特性,以习惯目标项目的风格。

今天看到基于范围的 for 循环了,当年还需要显示使用迭代器从begin()到end()完成遍历,现在已经很轻松了,直接auto和分号逐个引用容器内的元素。

对数组和容器的 C 样式迭代容易引发索引错误,而且键入过程单调乏味。 若要消除这些错误,并提高代码的可读性,可使用基于范围的 for 循环

大概就是下面这样,有一个vector需要遍历:

#include <iostream>
#include <vector>

std::vector<int> v {1,2,3};

C-style需要for循环,一个变量用作下标,标准流程,十分乏味,显得有些冗余。

// C-style
for(int i = 0; i < v.size(); ++i)
{
    std::cout << v[i];
}

现代C++的风格就很简洁,类型auto自动获取,省去迭代变量,直接拿目标元素。

// Modern C++:
for(auto& num : v)
{
    std::cout << num;
}

for-range-declaration 部分中声明的名称是 for 语句的本地名称,且无法在 expression 或 statement 中重新声明它

这是需要注意的,局部变量咱知道,注意的是你不能再在这个for循环里声明同名变量:

正确用法:

for (auto x : vec) {  // x 是这个循环的局部变量
    std::cout << x;
}

错误示例1:在循环体内重复声明

for (auto x : vec) {
    int x = 5;  // 错误!不能重新声明x
    std::cout << x;
}

错误示例2:在条件表达式中重复声明

for (auto x = get_value(); int x = 0; x < 10) {  // 错误!不能重新声明x
    // ...
}

正确:不同循环中的x是独立的

for (auto x : vec) { /* 第一个x */ }
for (auto x : vec) { /* 第二个x,与第一个无关 */ }

最后来个完整的示例和输出:

// range-based-for.cpp 
#include <iostream> 
#include <vector> 
using namespace std; 
int main() 
{ 
    // Basic 10-element integer array. 
    int x[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    // Range-based for loop to iterate through the array. 
    for( int y : x ) { 
        // Access by value using a copy declared as a specific type. // Not preferred. 
        cout << y << " "; 
    } cout << endl;
}