vector <int> v;
v.pushback(0);
v.pushback(1);
v.pushback(1);
v.pushback(0);
想要删除值为1的元素
错误代码
正确代码
else
关于迭代器机制,好好研究。参见 http://blog.youkuaiyun.com/bruce_wang_janet/article/details/6879289
每一次删除之后,后边的元素都会向前移动。
所以当前迭代器实际已经指向下一个元素,若再+1,实际上是指向了下一个元素的下一个元素。
以下为上述程序的详细执行过程
int main(int argc, char* argv[])
{
}
执行结果:
| 数据 | 1 | 2 | 3 | 4 | 未赋值 |
| 内存地址 | B0 | B4 | B8 | BC | C0 |
| 指针 | begin | | | | End |
| | | | | | Last |
执行第一个循环
tem=itr;
| 数据 | 1 | 2 | 3 | 4 | 未赋值 |
| 内存地址 | B0 | B4 | B8 | BC | C0 |
| 指针 | begin | | | | End |
| | Tem itr | | | | Last |
itr++;
| 数据 | 1 | 2 | 3 | 4 | 未赋值 |
| 内存地址 | B0 | B4 | B8 | BC | C0 |
| 指针 | begin | | | | End |
| | Tem | itr | | | Last |
v.erase(tem);
| 数据 | 2 | 3 | 4 | 4 | 未赋值 |
| 内存地址 | B0 | B4 | B8 | BC | C0 |
| 指针 | begin | | | Last | End |
| | Tem | itr | | | |
tem=itr;
| 数据 | 2 | 3 | 4 | 4 | 未赋值 |
| 内存地址 | B0 | B4 | B8 | BC | C0 |
| 指针 | begin | Tem | | Last | End |
| | | itr | | | |
itr++;
| 数据 | 2 | 3 | 4 | 4 | 未赋值 |
| 内存地址 | B0 | B4 | B8 | BC | C0 |
| 指针 | begin | Tem | | Last | End |
| | | | itr | | |
v.erase(tem);
| 数据 | 2 | 4 | 4 | 4 | 未赋值 |
| 内存地址 | B0 | B4 | B8 | BC | C0 |
| 指针 | begin | Tem | Last | | End |
| | | | itr | | |
可见,erase操作之后,last指针前移,而end指针未变,被删除的元素后边的元素前移,last之后的元素保持不变(并未移除)。完成之后计算size是由last-begin得到的。
原文链接:http://blog.sina.com.cn/s/blog_49d1bc3601011fiv.html
本文介绍在C++中如何正确地从vector容器中删除指定值的元素,并通过实例详细解析了迭代器的更新机制及其对删除操作的影响。
1349

被折叠的 条评论
为什么被折叠?



