C++ vector 结构体 根据某元素匹配 find_if 排序 sort
0x00 使用场景结构体的vector,有时候需要查找容器中符合某个结构体成员条件的情况。0x01 查找匹配成员 举例struct STest{int m_id;char name[16];STest(int id, char *lName){m_id = id;if (strlen(lName) ...
·
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条内容
所有评论(0)