c++有没有和auto it = remove_if(...)类似功能的函数,满足条件时不进行remove但是仍记录在迭代器中
时间: 2024-03-26 18:35:07 浏览: 100
深入学习C++_String2.1版.doc
是的,C++中有一个名为`std::partition`的函数,它可以将输入序列中满足特定条件的元素移动到序列的前面,不满足条件的元素移动到序列的后面,而不会改变它们的相对顺序。它返回一个迭代器,指向最后一个满足条件的元素的后一个位置。这个函数的原型如下:
```cpp
template <class ForwardIt, class UnaryPredicate>
ForwardIt partition(ForwardIt first, ForwardIt last, UnaryPredicate p);
```
其中,`first`和`last`表示输入序列的起始和终止位置,`p`是一个一元谓词,用于确定哪些元素应该被移动到序列的前面。在函数执行完毕后,满足条件的元素会被移动到序列的前面,而不满足条件的元素会被移动到序列的后面,但它们的相对顺序不会改变。返回的迭代器指向最后一个满足条件的元素的后一个位置。
举个例子,假设我们有一个`vector<int>`类型的序列,我们希望将其中所有小于10的元素移动到序列的前面,而其他元素移动到序列的后面,可以使用以下代码:
```cpp
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> v{5, 10, 15, 20, 25, 30, 35};
auto it = std::partition(v.begin(), v.end(), [](int i) { return i < 10; });
std::cout << "Less than 10:";
for (auto i = v.begin(); i != it; ++i) {
std::cout << ' ' << *i;
}
std::cout << "\nGreater than or equal to 10:";
for (auto i = it; i != v.end(); ++i) {
std::cout << ' ' << *i;
}
std::cout << '\n';
}
```
输出结果如下:
```
Less than 10: 5
Greater than or equal to 10: 10 15 20 25 30 35
```
可以看到,所有小于10的元素都被移动到了序列的前面,而其他元素则被移动到了序列的后面。
阅读全文