2

【原创】C++中vector与remove()函数 - Jev_0987

 1 year ago
source link: https://www.cnblogs.com/jev-0987/p/17510854.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【原创】C++中vector与remove()函数 - Jev_0987 - 博客园

话不多说,直接来

remove()干了什么:
把被删除元素 后面的元素 移动到当前被删除元素位置,返回最后一个被改变值的下一个迭代器。。

// 首先,定义一个vectorvector<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;}

大致流程如下:

  1. first指针找到第一个匹配元素;
  2. 索引 i 指向 first 所指元素;
  3. 索引i向后遍历,找到与first不同的元素,赋值给first指向元素,first指针后移;
  4. 循环第3步。(索引i到vector末尾结束循环)

画图解释一下

image

这样可以用来做什么?
首先,返回的first迭代器,刚好是我们所要vector的末尾。
也就是说demo.begin()到remove(3),是我们所需的vector(即删掉3)
但是我们会发现,其实还有元素留在vector里(它的size容量大小没有改变)
所以可以通过erase操作,把后面的删了(size容量变小,但是capacity容量不变)

auto remove_iter = remve(demo.begin(), demo.end(), 3);demo.erase(remove_iter, demo.end());

最终返回的结果:
1 4 5 6


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK