c++对vector容器进行边遍历边删除的安全例子
时间: 2023-12-23 17:04:44 浏览: 84
在C++中,对于一个容器进行边遍历边删除是不安全的操作。因为删除元素会改变容器的大小和元素的位置,可能会导致程序出现未定义的行为。
为了安全地删除vector容器中的元素,我们可以使用STL提供的erase-remove惯用法。这种惯用法将删除操作分成两步:首先使用remove函数将要删除的元素移到容器末尾,然后再使用erase函数删除末尾的元素。
下面是一个安全地删除vector容器中元素的例子:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> vec = {1, 2, 3, 4, 5};
// 删除所有偶数元素
vec.erase(remove_if(vec.begin(), vec.end(), [](int i){return i % 2 == 0;}), vec.end());
// 输出删除后的元素
for (auto i : vec)
{
cout << i << " ";
}
cout << endl;
return 0;
}
```
在上面的代码中,我们使用remove_if函数来移动要删除的元素,然后使用erase函数删除末尾的元素。这样做可以确保我们安全地删除vector容器中的元素。
相关问题
c++对vector容器进行边遍历边删除的安全迭代器例子
在C++中,对于vector容器的遍历和删除操作,需要使用安全迭代器来确保程序的正确性。安全迭代器的使用可以避免在遍历过程中对容器的修改操作引起的未定义行为。
以下是一个对vector容器进行边遍历边删除的安全迭代器例子,代码如下:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (auto it = vec.begin(); it != vec.end(); ) {
if (*it % 2 == 0) {
it = vec.erase(it); // 安全删除
} else {
cout << *it << " "; // 输出奇数元素
++it;
}
}
return 0;
}
```
在上面的例子中,我们使用了for循环来遍历vector容器,使用auto类型推导得到迭代器类型,然后在循环体内部,判断当前元素是否为偶数,如果是偶数,则使用安全删除函数erase()将其从容器中删除,否则输出奇数元素并将迭代器指向下一个元素。
需要注意的是,安全删除函数erase()返回的是下一个元素的迭代器,因此在执行erase()操作之后,需要将迭代器更新为erase()的返回值,以便继续遍历容器中的元素。
c++vector容器循环遍历 c++vector容器循环遍历
在 C++ 中,`std::vector` 是一个动态数组,常用于存储同类型的元素。要遍历 `vector` 容器,你可以使用 for 循环或者迭代器。以下是两种常见的遍历方法:
1. **Using a For Loop:**
```cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 遍历整个 vector
for (size_t i = 0; i < vec.size(); ++i) {
std::cout << vec[i] << " ";
}
std::cout << "\n";
return 0;
}
```
在这个例子中,我们通过索引 `i` 来访问每个元素。
2. **Using an Iterator:**
```cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int>::iterator it;
// 使用迭代器遍历
for (it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << "\n";
return 0;
}
```
这里使用 `vec.begin()` 和 `vec.end()` 获取迭代器范围,`*it` 表示当前迭代到的元素。
阅读全文