STL 中 partition 算法的使用

背景

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;
}

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值