在使用C++或其他支持STL(Standard Template Library)的编程语言时,std::vector
是一个常用的动态数组容器。当你在遍历 std::vector
并尝试删除元素时,直接使用迭代器进行删除可能会导致未定义行为,因为删除操作会改变容器的大小和内部结构,从而影响迭代器的有效性。
std::vector
的动态特性:std::vector
可以在运行时动态调整大小,但这种调整可能会导致所有现有迭代器失效。std::vector
提供了动态数组的功能,能够在运行时动态增减元素。std::vector
中的元素在内存中是连续存储的,这使得访问元素非常高效。std::vector
是一个模板类,可以存储任意类型的元素。当你需要在遍历 std::vector
时删除元素,可以使用以下几种方法:
从后向前遍历,删除元素时不会影响前面的迭代器。
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.rbegin(); it != vec.rend(); ) {
if (*it % 2 == 0) {
it = decltype(it)(vec.erase(std::next(it).base()));
} else {
++it;
}
}
for (const auto& num : vec) {
std::cout << num << " ";
}
return 0;
}
将不需要删除的元素复制到另一个容器中,然后替换原容器。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int> temp;
std::copy_if(vec.begin(), vec.end(), std::back_inserter(temp), [](int num) {
return num % 2 != 0;
});
vec.swap(temp);
for (const auto& num : vec) {
std::cout << num << " ";
}
return 0;
}
erase-remove
惯用法结合 std::remove_if
和 erase
方法,先标记需要删除的元素,然后一次性删除。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.erase(std::remove_if(vec.begin(), vec.end(), [](int num) {
return num % 2 == 0;
}), vec.end());
for (const auto& num : vec) {
std::cout << num << " ";
}
return 0;
}
通过以上方法,你可以安全地在遍历 std::vector
时删除元素,避免迭代器失效的问题。
领取专属 10元无门槛券
手把手带您无忧上云