栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ STL算法partition

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ STL算法partition

函数原型
template
_NODISCARD inline _FwdIt partition_point(_FwdIt _First, _FwdIt _Last, _Pr _Pred)

根据某个筛选规则对指定范围内的数据进行分组(即符合条件的为一组,不符合条件的为另一组),并返回两组数据之间的分界位置。

参数

  • fisrt last 输入容器
  • pred 可以是函数指针或函数对象或lambda表达式
函数 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

bool isEven(int a)
{
	std::cout << "a = " << a << std::endl;
	return a % 2 == 0;
}

int main()
{	
	std::vector b{ 1, 2, 3, 4, 5, 6, 7, 8 ,9 };
	std::partition(std::begin(b), std::end(b), isEven);
	std::copy(std::begin(b), std::end(b), std::ostream_iterator(std::cout, "; "));
	std::cout << "nn";

	std::vector::iterator it = std::partition_point(std::begin(b), std::end(b), isEven);
	if (it != std::end(b))
	{
		size_t dist = std::distance(std::begin(b), it);
		std::cout << "value: " << *it << "; distance: " << dist << std::endl;
	}

	return -1;
}

//输出
a = 1
a = 9
a = 8
a = 2
a = 3
a = 7
a = 6
a = 4
a = 5
8; 2; 6; 4; 5; 3; 7; 1; 9;

a = 5
a = 6
a = 4
value: 5; distance: 4
 仿函数
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

bool isEven(int a)
{
	std::cout << "a = " << a << std::endl;
	return a % 2 == 0;
}

class IsEven
{
public:
	IsEven(int b) :m_b(b) {}
	bool operator()(int value)
	{
		std::cout << "value = " << value << std::endl;
		return 0 == value % m_b;
	}
	int m_b;
};

int main()
{	
	std::vector b{ 1, 2, 3, 4, 5, 6, 7, 8 ,9 };
	std::partition(std::begin(b), std::end(b), IsEven(2));
	std::copy(std::begin(b), std::end(b), std::ostream_iterator(std::cout, "; "));
	std::cout << "nn";

	std::vector::iterator it = std::partition_point(std::begin(b), std::end(b), isEven);
	if (it != std::end(b))
	{
		size_t dist = std::distance(std::begin(b), it);
		std::cout << "value: " << *it << "; distance: " << dist << std::endl;
	}

	return -1;
}
bind

 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

bool isEven(int a, int b)
{
	std::cout << "a = " << a << std::endl;
	return a % 2 == 0;
}

class IsEven
{
public:
	IsEven(int b) :m_b(b) {}
	bool operator()(int value)
	{
		std::cout << "value = " << value << std::endl;
		return 0 == value % m_b;
	}
	int m_b;
};

int main()
{	
	std::vector b{ 1, 2, 3, 4, 5, 6, 7, 8 ,9 };
	auto f1 = std::bind(isEven, std::placeholders::_1, 2);
	std::partition(std::begin(b), std::end(b), f1);
	std::copy(std::begin(b), std::end(b), std::ostream_iterator(std::cout, "; "));
	std::cout << "nn";

	auto f2 = std::bind(IsEven(2), std::placeholders::_1);
	std::vector::iterator it = std::partition_point(std::begin(b), std::end(b), f2);
	if (it != std::end(b))
	{
		size_t dist = std::distance(std::begin(b), it);
		std::cout << "value: " << *it << "; distance: " << dist << std::endl;
	}

	return -1;
}

//输出
a = 1
a = 9
a = 8
a = 2
a = 3
a = 7
a = 6
a = 4
a = 5
8; 2; 6; 4; 5; 3; 7; 1; 9;

value = 5
value = 6
value = 4
value: 5; distance: 4
lambda

 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

class IsEven
{
public:
	IsEven(int b) :m_b(b) {}
	bool operator()(int value)
	{
		std::cout << "value = " << value << std::endl;
		return 0 == value % m_b;
	}
	int m_b;
};

int main()
{	
	std::vector b{ 1, 2, 3, 4, 5, 6, 7, 8 ,9 };
	std::partition(std::begin(b), std::end(b), [](int b) { return 0 == b % 2; });
	std::copy(std::begin(b), std::end(b), std::ostream_iterator(std::cout, "; "));
	std::cout << "nn";

	auto f2 = std::bind(IsEven(2), std::placeholders::_1);
	std::vector::iterator it = std::partition_point(std::begin(b), std::end(b), f2);
	if (it != std::end(b))
	{
		size_t dist = std::distance(std::begin(b), it);
		std::cout << "value: " << *it << "; distance: " << dist << std::endl;
	}

	return -1;
}

//输出
8; 2; 6; 4; 5; 3; 7; 1; 9;

value = 5
value = 6
value = 4
value: 5; distance: 4

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/698540.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号