v.pushback(0);
v.pushback(1);
v.pushback(1);
v.pushback(0);
想要删除值为1的元素
错误代码
正确代码
else
关于迭代器机制,好好研究。参见 http://blog.csdn.net/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 |
| Temitr | | | | 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得到的。