如何在 C++ STL 的 sort() 中编写 Comp 函数

How to write Comp function in sort() of C++ STL

本文关键字:函数 Comp sort C++ STL      更新时间:2023-10-16

在下面的代码中,strArray 是一个字符串数组,vec 包含每个字符串的相应 ID。我想根据 strArray 中的字符串对 vec 中的 ID 进行排序。

如何按排序设计 Comp 函数?

class myClass
{
public:
        int V;
        vector<int> vec;
        string* strArray;
        myClass(int v);
        void myFunc();
}
myClass::myClass(int v, vector<int> vec1)
{
    V = v;
    strArray = new string[v];
    vec.swap(vec1)
}
void myClass::myFunc()
{
    //....
    for(i = 0; i<V; i++)
        strArray[i] = GenerateString(vec[i]);// GenerateString() can return a string.
    sort(vec.begin(), vec.end(), Comp);// sort vec based on strArray,how to design the Comp funtion?
    //....
}
main()
{
    int myints[] = {32,71,12,45,26,80,53,33};
    vector<int> myvector (myints, myints+8);
    myClass obj(8, myvector);
    obj.myFunc();
    return 0;
}

将成员string* strArray;更改为std::pair<std::string, int> strArray;,更改分配strArray = new std::pair<std::string, int>[v];并在myFunc中进行以下更改

void myClass::myFunc()
{
    //....
    for(i = 0; i<V; i++)
        strArray[i] = make_pair(GenerateString(vec[i]), vec[i]);// GenerateString() can return a string.
    sort(vec.begin(), vec.end());
    std::transform(
        strArray,
        strArray + V,
        vec.begin(),
        [](const std::pair<std::string, int> &p) -> int { return p.second; }
    );
    //....
}

在此代码中,我们耦合或配对生成字符串的数字(vec[i])并对数组进行排序。现在使用 std::transform ,将数字复制回vec

来自评论

如果您不了解 lambda 函数,也可以在其他地方编写一个函数,并将其作为第四个参数传递std::transform

static int fetch_int_from_pair(const std::pair<std::string, int> &p) {
 return p.second;
}
...
td::transform(
        strArray,
        strArray + V,
        vec.begin(),
        fetch_int_from_pair
    );