适合谁看:资深的嵌入式系统底层专家。技能栈(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;
}