有关迭代器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 @ 2022-08-30 21:40  atomxing  阅读(246)  评论(0编辑  收藏  举报