C++ vector 结构体 根据某元素匹配 find_it 排序 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 函数中
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(), 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)
{
    // 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

猜你喜欢

转载自blog.csdn.net/u013005025/article/details/81664578
今日推荐