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);
}
};
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)
{
auto it = find_if(v.begin(), v.end(), CVecFind(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;
}
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)
{
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