C++ vector 结构体 根据某元素匹配 find_if 排序 sort

0x00 使用场景

 结构体的vector,有时候需要查找容器中符合某个结构体成员条件的情况。
 STL中的sort排序函数默认的是,从小到大(小于号)排列,有时我们期望按照别的规则来排序。

0x01 查找匹配成员 举例

struct STest
{
	int m_id;
	char name[16];
	STest(int id, char *lName)
	{
		m_id = id; 
		if (strlen(lName) < 16)
			memcpy(name, lName, strlen(lName)+1); 
		else 
			memcpy(name, lName, 16);
	}
};
// 构造函数需要用来放到find_if 函数中
class CVecFinder
{
public:
	CVecFinder(const int id) :m_id(id) {}
	// 重载该函数以完成比较
	bool operator ()(const vector<STest>::value_type & value)
	{
		return value->m_id == m_id;
	}
private:
	int m_id;
};
char * FindNameById(const vector<STest>& v, int id)
{
	// find_if 在头文件 algorithm.h 中
	auto it = find_if(v.begin(), v.end(), CVecFinder(id));
	if (it != v.end())
		return it->name;
	else 
		return "";
}
int main()
{
	vector<STest> v;
	v.push_back(STest(1, "zhangsan"));
	v.push_back(STest(2, "lisi"));
	v.push_back(STest(3, "wangwu"));
	char * findName = FindNameById(v, 2);
	cout << findName << endl; 
	return 0;
}

// find_if 原理
_InIt find_if(_InIt _First, _InIt _Last, _Pr _Pred)
{
	...
	return (_Rechecked(_First,
		_Find_if(_Unchecked(_First), _Unchecked(_Last), _Pred)));
}
_InIt _Find_if(_InIt _First, _InIt _Last, _Pr _Pred)
{	// find first satisfying _Pred
	for (; _First != _Last; ++_First)
		if (_Pred(*_First))  // 此处调用了对象的 () 操作符, 所以需要重载该类的 operator().
			break;
	return (_First);
}

0x02 排序举例

struct STest
{
	int m_id;
	int m_age;
	char name[16];
	STest(int id, int age, char *lName)
	{
		m_id = id; 
		m_age = age;
		if (strlen(lName) < 16)
			memcpy(name, lName, strlen(lName)+1); 
		else 
			memcpy(name, lName, 16);
	}
};

bool compAgeDesc(const STest& s1, const STest& s2)
{
	// STL中的 sort函数的第三个参数  比较函数,默认的排序是 小于号 < 
	// 对于结构体的默认比较什么 不太清楚,但是默认的比较符号是  小于号 <
	// 此处排序是  age越大  index越小
	return s1.m_age > s2.m_age;
}

int main()
{
	vector<STest> v;
	v.push_back(STest(13, 18, "zhangsan"));
	v.push_back(STest(5, 21, "lisi"));
	v.push_back(STest(7, 24, "wangwu"));
	sort(v.begin(), v.end(), compAgeDesc);
	for (const STest& s : v)
		cout << v.m_id << " "; 
	return 0;
}
输出结果:7 5 13

欢迎关注 [懒人漫说] 公众号,分享Java、Android、C/C++ 技术,
包括基础、自己遇到的问题解决过程。
在这里插入图片描述
当然如果关注并留言问题的话,我们力所能及的话会帮你解决并回复哟。我们和你一样,是正在成长的程序员,我们也会分享自己的成长路上的感想,希望可以和你一起努力成长。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值