目录
C++中vector与remove()函数
话不多说,直接来
remove()干了什么:把被删除元素 后面的元素 移动到当前被删除元素位置,返回最后一个被改变值的下一个迭代器。。
举栗:
// 首先,定义一个vector vector<int> demo = {1,3,3,4,3,5,6};
vector的对应值分别为:1,3,3,4,3,5,6
// 调用remove函数 vector<int>:: iterator demo_return = remove(demo.begin(), demo.end(), 3);
打印查看最终结果
cout << "remove() return:" <<endl; for(auto iter = demo_return; iter != demo_return.end(); ++iter){ cout << *iter << ' '; } cout << endl; cout << "after remove():" << endl; for(auto iter = demo.begin(); iter != demo.end(); ++iter){ cout << *iter << ' '; }
remove() return:
3 5 6
after remove():
1 4 5 6 3 5 6
可以看到,最终结果:
remove函数返回值是:3,5,6
在remove函数操作后vector为:1,4,5,6,3,5,6
它到底做了什么?
还是那句话:把被删除元素 后面的元素 移动到当前被删除元素位置,返回最后一个被改变值的下一个迭代器。。源码如下:
remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_) { __first = _VSTD::find(__first, __last, __value_); if (__first != __last) { _ForwardIterator __i = __first; while (++__i != __last) { if (!(*__i == __value_)) { *__first = _VSTD::move(*__i); ++__first; } } } return __first; }
大致流程如下:
- first指针找到第一个匹配元素;
- 索引 i 指向 first 所指元素;
- 索引i向后遍历,找到与first不同的元素,赋值给first指向元素,first指针后移;
- 循环第3步。(索引i到vector末尾结束循环)
画图解释一下
后续
这样可以用来做什么?首先,返回的first迭代器,刚好是我们所要vector的末尾。也就是说demo.begin()到remove(3),是我们所需的vector(即删掉3)但是我们会发现,其实还有元素留在vector里(它的size容量大小没有改变)所以可以通过erase操作,把后面的删了(size容量变小,但是capacity容量不变)
最终返回的结果:
1 4 5 6