stl容器迴圈刪除元素總結

2021-09-04 12:19:21 字數 1957 閱讀 2758

程式中有一段**是關於stl迴圈刪除的內容,大體邏輯如下(實際邏輯要複雜的多,不適合用std::remove系列函式):

int main(int argc, char **argv)

; auto it_vec = vec.begin();

while (it_vec != vec.end())

++it_vec;

} return 0;

}

儘管平常都是用std::remove系列函式,但印象中上面的**也沒有任何問題的,但是程式一執行卻當掉了。原因是每次執行std::vector::erase之後,迭代器是失效,當再次執行it_vec != vc.end()時,程式當掉。具體原因:std::vector,std::string,std::deque等順序儲存的容器,插入刪除操作均會是所有容器失效;std::list,std::map,std::set等非順序儲存的容器,執行刪除操作僅會是當前迭代器失效,插入操作不會是任何迭代器失效。無論是順序結構容器,還是非順序結構容器,刪除操作都會返回最後乙個被刪除元素的後乙個迭代器。

因此,對於std::vector,std::string,std::deque而言,正確的迴圈刪除操作如下:

int main(int argc, char **argv)

; auto it_vec = vec.begin();

while (it_vec != vec.end())

++it_vec;

} std::string str("school college");

auto it_str = str.begin();

while (it_str != str.end())

++it_str;

} std::dequedeq;

auto it_deq = deq.begin();

while (it_deq != deq.end())

++it_deq;

} getchar();

return 0;

}

對於std::list,std::map,std::set等非順序容器,正確的迴圈刪除操作可以是下面的樣子:

int main(int argc, char **argv)

; auto it_lst = lst.begin();

while (it_lst != lst.end())

++it_lst;

} std::mapmp, , , , , , , , , };

auto it_mp = mp.begin();

while (it_mp != mp.end())

++it_mp;

} std::setst;

auto it_st = st.begin();

while (it_st != st.end())

++it_st;

} getchar();

return 0;

}

也可以是下面的樣子:

int main(int argc, char **argv)

; auto it_lst = lst.begin();

while (it_lst != lst.end())

++it_lst;

} std::mapmp, , , , , , , , , };

auto it_mp = mp.begin();

while (it_mp != mp.end())

++it_mp;

} std::setst;

auto it_st = st.begin();

while (it_st != st.end())

++it_st;

} getchar();

return 0;

}

安全刪除STL容器元素

stl容器迭代過程中刪除元素技巧 序列容器的erase方法返回值是指向緊接在被刪除元素之後的元素的有效迭代器,可以根據這個返回值來安全刪除元素。vectorc for vector iterator it c.begin it c.end 關聯容器的 erase 方法沒有返回值,被刪除的迭代器失效,...

STL容器刪除元素的陷阱

今天看scott meyers大師的stl的用法,看到了我前段時間犯的乙個錯誤,發現我寫的 和他提到錯誤 幾乎一模一樣,有關stl容器刪除元素的問題,錯誤的 如下 std vectormfriendlist std vector iterator iter mfriendlist.begin for...

STL容器遍歷時刪除元素

stl容器遍歷時在迴圈體內刪除元素最容易出錯了,根本原因都是因為迭代器有效性問題,在此記下通用刪除方法,該方法適用於所有含erase成員函式的序列容器 1 std vectormyvec 23 std vector iterator it myvec.begin 4while it myvec.en...