C++迭代器在刪除元素後的失效問題
阿新 • • 發佈:2019-01-07
C++迭代器失效問題__map/set等關聯容器如何刪除元素__vector/list/deque等序列容器如何刪除元素__迭代器如何使用
序列性容器::(vector和list和deque)
erase迭代器不僅使所指向被刪元素的迭代器失效,而且使被刪元素之後的所有迭代器失效,所以不能使用erase(iter++)的方式,但是erase的返回值為下一個有效的迭代器。
所以正確方法為::
for( iter = c.begin(); iter != c.end(); )
iter = c.erase(iter);
關聯性容器::(map和set比較常用)
erase迭代器只是被刪元素的迭代器失效,但是返回值為void,所以要採用erase(iter++)的方式刪除迭代器,
所以正確方法為::
for( iter = c.begin(); iter != c.end(); )
c.erase(iter++);
Tips:
其實對於list兩種方式都可以正常工作
STL的容器刪除元素,除了使用迭代器外,還可以使用erase(key)的方式。
size_t rm_num = obj.erase(key);
rm_num標示刪除key的成員的個數,在map中key是key值,在其他容器中,key是一個value。
序列性容器::(vector和list和deque)
erase迭代器不僅使所指向被刪元素的迭代器失效,而且使被刪元素之後的所有迭代器失效,所以不能使用erase(iter++)的方式,但是erase的返回值為下一個有效的迭代器。
所以正確方法為::
for( iter = c.begin(); iter != c.end(); )
iter = c.erase(iter);
關聯性容器::(map和set比較常用)
erase迭代器只是被刪元素的迭代器失效,但是返回值為void,所以要採用erase(iter++)的方式刪除迭代器,
所以正確方法為::
for( iter = c.begin(); iter != c.end(); )
c.erase(iter++);
Tips:
其實對於list兩種方式都可以正常工作
STL的容器刪除元素,除了使用迭代器外,還可以使用erase(key)的方式。
size_t rm_num = obj.erase(key);
rm_num標示刪除key的成員的個數,在map中key是key值,在其他容器中,key是一個value。