有关迭代器erase后失效的问题

序列式容器vector,deque

使用erase删除迭代器后,后面的元素的迭代器会失效。但是erase会返回下一个有效的迭代器

int main() {

        vector<int> v{ 1,2,3,4 };

        vector<int>::iterator it = find(v.begin(), v.end(), 1);

        auto it1 = v.erase(it);

        cout << *it1 << endl;

}

上面代码输出2.

   

数组形式的容器在进行erase时,会在删除前使it指向下一个位置,同时后面的数据会向前面移动一个位置

int main() {

        vector<int> v{ 1,2,3,4 };

        vector<int>::iterator it = find(v.begin(), v.end(), 1);

        v.erase(it);

        cout << *it << endl;

}

上面代码输出也为2.(可以不用新的迭代器记录!)

   

   

   

关联式容器set,map

使用erase删除迭代器后,当前元素的迭代器失效,但是后面的元素的迭代器还有效。这就需要记录下一个元素的迭代器了。

int main() {

set<int> s{ 1,2,3,4 };

        set<int>::iterator it2 = s.find(1);

        s.erase(it2++);

        cout << *it2 << endl;

}

上面代码输出2.

   

   

序列式容器list

erase会返回下一个有效的迭代器,因此可以使用vector的方法。分配的内存不是连续的,因此可以采用set的方法。

   

int main() {

list<int> l{ 1,2,3,4 };

        list<int>::iterator it3 = find(l.begin(), l.end(), 1);

        auto it4 = l.erase(it3);

        cout << *it4 << endl;

}

int main() {

        list<int> l{ 1,2,3,4 };

        list<int>::iterator it5 = find(l.begin(), l.end(), 1);

        l.erase(it5++);

        cout << *it5 << endl;

}

上面代码都输出2.

posted @   atomxing  阅读(251)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示