从去年夏天
到今年春天
不知不觉大家相处了这么久
在这个结业的时光里
充满着伤感与离别
以及对未来的憧憬
希望在嵌入式道路上愈走愈远
一.项目答辩
在正式结业之前
大家要对自己这段时间的学习
进行一次综合性的检测
小组四到五人一起
做出一个综合性的项目
并成功演示
大家对待这次答辩十分认真
相信他们一定可以做出
令老师、令自己
满意的项目
二.结业证书
毕业典礼
当然要拿到结业证
才算真正的结束啦
望大家在今后的日子里
不忘曾经在华清
努力奋斗的自己
三.学习笔记分享
vector迭代器的失效与解决方法
向上滑动阅览
原因1:vector扩容引起迭代器失效
扩容操作可能引起迭代器失效,因为vector扩容是分配一个新的数组,然后全部元素移到新的数组中。
以下示例便会引起迭代器失效:
void test_1()
{
vectorvec;
vec.push_back(0);
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
cout << vec.size() << ":" << vec.capacity() << endl;
vector::iterator it = vec.begin();
while (it != vec.end())
{
if (*it % 2 == 0)
{
vec.insert(it, 5);
++it;
}
++it;
}
cout << vec.size() << ":" << vec.capacity() << endl;
for (auto e : vec)
{
cout << e << " ";
}
cout << endl;
}
原因:insert之后vector会分配新的空间,旧迭代器便会失效。
解决办法:取insert函数的返回值为新的迭代器。
原因2:迭代器指向的位置的意义改变
比如,在调用删除函数erase后可能出现迭代器失效。
示例:
void test_2()
{
std::vectorvec;
vec.push_back(0);
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
auto it = vec.begin();
while (it != vec.end())
{
if (*it % 2 == 0)
{
vec.erase(it);
}
else
{
++it;
}
}
for (auto e : vec)
{
cout << e << " ";
}
cout << endl;
}
原因:erase之后pos位置之后的元素会往前移动,如果pos位置是最后一个元素,则删除后pos为end的位置,而end的位置没有有效元素的,所以pos失效。因此有些编译器会禁止这类操作而报错,最好不要再直接操作erase后的迭代器。
解决办法:取erase函数的返回值为新的迭代器。
我们结业啦!
祝愿大家未来可期,不负韶华
保持热爱,奔赴山海