C++ vector中erase和insert引起迭代器失效
作者:野牛程序员:2023-07-31 21:57:41 C++阅读 2353
在 C++ 的 vector
容器中,使用 erase
和 insert
成员函数都有可能引起迭代器的失效。这是因为这两个操作会改变容器的大小和内部结构,导致原先有效的迭代器不再指向有效的元素或被迭代器的指向无效的位置。
erase 引起迭代器失效:
使用 erase
函数从 vector
中删除元素时,被删除元素之后的所有元素会向前移动,这可能导致原先的迭代器失效。删除元素后,原先的迭代器可能会指向无效的位置或者指向一个不正确的元素。
示例:
#include <iostream> #include <vector> int main() { std::vector<int> numbers = {1, 2, 3, 4, 5}; auto it = numbers.begin() + 2; // 指向第3个元素(值为3)的迭代器 numbers.erase(it); // 删除第3个元素(值为3) // 此时迭代器已经失效,不能再使用 std::cout << *it << std::endl; // 此处访问已失效的迭代器将导致未定义的行为 return 0; }
insert 引起迭代器失效:
使用 insert
函数在 vector
中插入元素时,如果插入点之前有元素被添加进来,整个 vector
的存储位置可能会改变,导致原先的迭代器失效。
示例:
#include <iostream> #include <vector> int main() { std::vector<int> numbers = {1, 2, 3, 4, 5}; auto it = numbers.begin() + 2; // 指向第3个元素(值为3)的迭代器 numbers.insert(it, 10); // 在第3个元素(值为3)前插入元素10 // 此时迭代器已经失效,不能再使用 std::cout << *it << std::endl; // 此处访问已失效的迭代器将导致未定义的行为 return 0; }
为了避免迭代器失效的问题,可以在进行 erase
或 insert
操作后,使用返回值来更新迭代器,确保迭代器仍然指向有效的元素。
示例:
#include <iostream> #include <vector> int main() { std::vector<int> numbers = {1, 2, 3, 4, 5}; auto it = numbers.begin() + 2; // 指向第3个元素(值为3)的迭代器 it = numbers.erase(it); // 删除第3个元素(值为3),并更新迭代器 // 此时迭代器仍然有效 std::cout << *it << std::endl; // Output: 4 (现在 it 指向值为4的元素) return 0; }
总结起来,对于 vector
的 erase
和 insert
操作,使用返回值来更新迭代器可以避免迭代器失效的问题,确保迭代器继续指向有效的元素。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
- 上一篇:c++为什么erase之后迭代器失效
- 下一篇:c++什么情况下使用迭代器