std::remove_if 例子
时间: 2024-09-07 10:00:16 浏览: 45
`std::remove_if` 是 C++ 标准库 `<algorithm>` 中的一个函数模板,用于从已排序的范围中移除满足特定条件的元素,并返回一个新的位置,新序列中剩下的元素将保持原有的顺序。它不会改变原容器的大小,而是移动所有大于或等于指定值的元素到其后。
下面是一个简单的 `std::remove_if` 示例,假设我们有一个整数向量 `v`,我们要移除其中所有的偶数:
```cpp
#include <vector>
#include <algorithm>
std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// 定义一个函数作为条件判断,如果元素是偶数则返回true
bool is_even(int num) {
return num % 2 == 0;
}
// 使用 remove_if 删除偶数
auto new_end = std::remove_if(v.begin(), v.end(), is_even);
// 如果有元素被移除,那么new_end会指向第一个不应该删除的位置
v.erase(new_end, v.end()); // 移除了所有偶数
// 新的向量 v 将只包含奇数:{1, 3, 5, 7, 9}
```
在这个例子中,`new_end` 等于 `v.end()` 之前最后一个不是偶数的元素位置。注意,`erase` 函数需要两个迭代器,第一个是从开头开始直到要删除部分结束的地方,第二个是要删除部分的结束位置。
相关问题
std::remove ,std::copy_if ,std::partition,std::unique,std::unique_copy的用法,给出例子
这些都是C++ STL中的算法,用于对容器中的元素进行处理。下面分别给出每个算法的用法和示例:
1. std::remove: 从容器中删除指定的元素
```cpp
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 2, 4, 2, 5};
auto it = std::remove(vec.begin(), vec.end(), 2); // 删除所有值为2的元素
vec.erase(it, vec.end()); // 删除多余的元素
for (auto x : vec) {
std::cout << x << " "; // 输出:1 3 4 5
}
return 0;
}
```
2. std::copy_if: 将符合条件的元素复制到新的容器中
```cpp
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int> odd_vec;
std::copy_if(vec.begin(), vec.end(), std::back_inserter(odd_vec), [](int x) { return x % 2 == 1; }); // 复制所有奇数到odd_vec中
for (auto x : odd_vec) {
std::cout << x << " "; // 输出:1 3 5
}
return 0;
}
```
3. std::partition: 将容器中的元素按照条件分为两部分,满足条件的在前面,不满足条件的在后面
```cpp
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = std::partition(vec.begin(), vec.end(), [](int x) { return x % 2 == 1; }); // 将容器中的元素按照奇偶分为两部分
for (auto x : vec) {
std::cout << x << " "; // 输出:1 5 3 4 2
}
return 0;
}
```
4. std::unique: 删除容器中相邻的重复元素
```cpp
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 2, 3, 3, 3, 4, 5, 5};
auto it = std::unique(vec.begin(), vec.end()); // 删除相邻的重复元素
vec.erase(it, vec.end()); // 删除多余的元素
for (auto x : vec) {
std::cout << x << " "; // 输出:1 2 3 4 5
}
return 0;
}
```
5. std::unique_copy: 将容器中相邻的重复元素复制到新的容器中
```cpp
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 2, 3, 3, 3, 4, 5, 5};
std::vector<int> unique_vec;
std::unique_copy(vec.begin(), vec.end(), std::back_inserter(unique_vec)); // 将相邻的重复元素复制到unique_vec中
for (auto x : unique_vec) {
std::cout << x << " "; // 输出:1 2 3 4 5
}
return 0;
}
```
std::remove_copy_if
`std::remove_copy_if`是C++标准库中的算法之一,它用于将容器(通常是`std::vector`)中的元素移动到一个新的位置,同时删除那些不符合给定条件的元素。这个函数接受三个参数:
1. `first`和`last`:这是待处理范围的迭代器,指向待处理序列的开始和结束位置。
2. `dest`:这是目标位置的迭代器,即未处理部分的开头。在这个过程中,符合条件的元素会被放置在这里。
3. `pred`:这是一个谓词函数,通常是一个lambda表达式,用于判断元素是否需要被移除。如果`pred(*element)`返回true,则该元素将被移除。
例如,在上面的场景中,我们用`[condition](int value) { return value > condition; }`作为谓词,检查每个元素是否大于指定的条件。
使用`std::remove_copy_if`之后,`first`将会被移动到最后一个未被移除的元素的下一个位置。但是请注意,这个函数并不会真正地删除元素,只是改变了它们的位置。为了实际删除元素,你需要再调用一次`erase`方法,从`first`到`dest`之间的区域,因为现在这部分已经是无用的了。
举个例子:
```cpp
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
numbers.erase(std::remove_copy_if(numbers.begin(), numbers.end(), numbers.end(), [](int n) { return n % 2 == 0; }), numbers.end());
```
这里会将`numbers`中所有的偶数移动到末尾,然后删除这些偶数,保留奇数。
阅读全文