面试之中经常被问到erase函数和remove函数的区别,自己也只是在网上看的别人写的,也没去验证过,最近反思,觉得这种学习态度太危险明明自己有能力去追究和验证的东西却没有进一步去弄清楚,很危险。所以决定遇到疑难点要自己想办法一探究竟并且把学习过程记录下来,所以就有了霸气zhangyh。这个是工作后第一篇,之前读书时候也在CSDN写过一些,以后我想我这边每周会写一篇吧,有可能是技术型的有可能是生活日记也有可能纯属放屁,总之想记录下生活的点滴了。
关于erase话不多少我先直接上源码
int main(int argc, char *argv[])
{
std::vector<int> y_container;
for (int i = 0; i < 11; ++i)
{
y_container.push_back(i);
}
std::vector<int>::iterator it = y_container.begin();
for (;it != y_container.end();)
{
if (*it == 10 )
{
y_container.erase(it);
}
else
{
std::cout<<*it<<std::endl;
it++;
}
}
}
我这里只是提供了带有erase的一种遍历方式,erase会删除指定位置的,erase的删除会使当前的it迭代器和it之后的迭代器失效,指向的已经不是原来的值了,erase的实现是将指定位置之后的元素都往前移,并且销毁最后一个元素,将大小减一,并且返回当前删除元素的位置,不过erase后删除元素位置已经是下一个元素的值。所以这里删除了10后,之后的元素往前移,所以我这里没有自增迭代器。说这么多都是废话了,还不如vector erase函数源码来的实在。
iterator erase(iterator __position) {
if (__position + 1 != end())
copy(__position + 1, _M_finish, __position);
--_M_finish;
destroy(_M_finish);
return __position;
}
如果删除最后一个位置的元素最好了,直接销毁。不是的话会调用copy函数将__position之后的元素都往前移动一个位置,再销毁最后一个元素,并且末尾迭代器减1。迭代器这里是前闭后开原则。
之后我会继续学习vector函数的知识点,一个容器一个容器来吧。