在遍历vector
时,如果在循环中删除或清空了其中的某个元素,可能会导致迭代器失效或者遍历不完整。为了确保遍历整个vector
,可以考虑使用迭代器或者索引来遍历。
如果使用迭代器,可以在循环中使用一个临时的迭代器保存要删除的元素的下一个迭代器,然后在循环体中使用这个临时迭代器来遍历vector
。这样可以确保即使有元素被删除,也能继续遍历整个vector
。示例代码如下:
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ) {
if (*it == 3) {
auto temp = it; // 保存要删除的元素的下一个迭代器
++temp;
vec.erase(it); // 删除元素
it = temp; // 更新迭代器
} else {
std::cout << *it << " ";
++it;
}
}
如果使用索引,可以在循环中使用一个计数器来记录当前遍历到的索引位置,然后在删除元素时不直接删除,而是将要删除的元素的值置为一个特殊的标记(如-1),最后再遍历一次vector
,将所有标记的元素删除。这样可以确保即使有元素被删除,也能继续遍历整个vector
。示例代码如下:
std::vector<int> vec = {1, 2, 3, 4, 5};
int count = 0;
for (auto& elem : vec) {
if (elem == 3) {
elem = -1; // 标记要删除的元素
} else {
std::cout << elem << " ";
}
++count;
}
for (int i = 0; i < count; ++i) {
if (vec[i] == -1) {
vec.erase(vec.begin() + i); // 删除标记的元素
--i;
--count;
}
}
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<string> v = {"hello", "world", "!", "how", "are", "you"};
for (auto it = v.begin(); it != v.end(); ) {
if (it->empty()) {
it = v.erase(it);
} else {
cout << *it << " ";
++it;
}
}
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<string> v = {"apple", "banana", "cherry", "durian", "eggfruit", "fig"};
for (auto it = v.begin(); it != v.end(); ) {
if (distance(v.begin(), it) == 2) { // 判断是否为第三项
it = v.erase(it); // 删除第三项
} else {
if (!it->empty()) { // 判断元素是否为空
cout << *it << " "; // 输出非第三项且非空的元素
}
++it;
}
}
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<string> v = {"apple", "banana", "cherry", "durian", "eggfruit", "fig"};
for (auto it = v.begin(); it != v.end(); ) {
int idx = distance(v.begin(), it);
if (idx == 2 || idx == 4) { // 判断是否为第三项或第五项
it = v.erase(it); // 删除第三项或第五项
} else {
if (!it->empty()) { // 判断元素是否为空
cout << *it << " "; // 输出非第三项、第五项且非空的元素
}
++it;
}
}
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<string> v = {"apple", "banana", "cherry", "durian", "eggfruit", "fig"};
vector<int> indices_to_remove = {2, 4}; // 需要移除的索引列表
sort(indices_to_remove.begin(), indices_to_remove.end()); // 将需要移除的索引列表按照升序排序
int removed_count = 0; // 记录已经移除的元素个数
for (auto it = v.begin(); it != v.end(); ) {
int idx = distance(v.begin(), it);
if (removed_count < indices_to_remove.size() && idx == indices_to_remove[removed_count]) { // 判断是否需要移除当前元素
it = v.erase(it); // 删除当前元素
++removed_count; // 更新已经移除的元素个数
} else {
if (!it->empty()) { // 判断元素是否为空
cout << *it << " "; // 输出非移除项且非空的元素
}
++it;
}
}
return 0;
}