背景
STL 中包含一些分组有关的算法,需要引用有文件 #include 。
partition()
①.概述
使用输入的比较函数对指定范围的元素重新排序,把结果为 true 的元素放在结果为 false 的元素之前,并返回两部分数据的分界位置的迭代器、指向第 2 部分数据的第 1 个元素。
②.代码示例
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
bool cmpFunc(int i) {
return i % 2 == 0;
}
int main()
{
vector<int> m_vector{ 1,2,3,4,5,6,7,8,9,0 };
cout << "排序前:" << endl;
for (auto i : m_vector) cout << i << " ";
cout << endl;
auto bound = partition(m_vector.begin(), m_vector.end(), cmpFunc);
cout << "排序后:" << endl;
for (auto i : m_vector) cout << i << " ";
cout << endl;
cout << "分界点元素值:" << *bound << endl;
system("pause");
return 0;
}
stable_partition()
①.概述
使用 partition 函数按指定的方式排序后不保证各组中元素的相对顺序不变,使用 stable_partition 可以保证分组排序后各组中元素的相对顺序不变。
②.代码示例
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
bool cmpFunc(int i) {
return i % 2 == 0;
}
int main()
{
vector<int> m_vector{ 1,2,3,4,5,6,7,8,9,0 };
cout << "排序前:" << endl;
for (auto i : m_vector) cout << i << " ";
cout << endl;
auto bound = stable_partition(m_vector.begin(), m_vector.end(), cmpFunc);
cout << "排序后:" << endl;
for (auto i : m_vector) cout << i << " ";
cout << endl;
cout << "分界点元素值:" << *bound << endl;
system("pause");
return 0;
}
partition_copy
①.概述
partition_copy 函数同样会按指定的方式对序列进行分组,但不会修改原序列而是复制分组结果到指定的位置。
②.代码示例
#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
bool cmpFunc(int i) {
return i % 2 == 0;
}
int main()
{
vector<int> m_vector{ 1,2,3,4,5,6,7,8,9,0 };
vector<int> vec1;
vector<int> vec2;
cout << "排序前:" << endl;
for (auto i : m_vector) cout << i << " ";
cout << endl;
partition_copy(m_vector.begin(), m_vector.end(),back_inserter(vec1), back_inserter(vec2), cmpFunc);
cout << "vec1:" << endl;
copy(begin(vec1), end(vec1), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "vec2:" << endl;
copy(begin(vec2), end(vec2), ostream_iterator<int>(cout, " "));
cout << endl;
system("pause");
return 0;
}
partition_point
①.概述
partition_point 可以返回已经按指定规则分组排行序好的两组元素的分界点迭代器,指向第2部分数据的第1个元素。
②.代码示例
#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
bool cmpFunc(int i) {
return i % 2 == 0;
}
int main()
{
vector<int> m_vector{ 2,4,6,8,1,3,5,7,9 };
auto bound = partition_point(m_vector.begin(), m_vector.end(), cmpFunc);
cout << "分界点下标:"<<bound - m_vector.begin() << " 元素值:"<< *bound << endl;
system("pause");
return 0;
}