Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::algorithm::sort的比较器?_C++_Algorithm - Fatal编程技术网

C++ std::algorithm::sort的比较器?

C++ std::algorithm::sort的比较器?,c++,algorithm,C++,Algorithm,错误如下所示: 1> C:\ProgramFilesx86\Microsoft Visual Studio 11.0\VC\include\algorithm3781:错误C2664:“布尔排序索引::”运算符 size\t,size\t const':无法将参数1从 “标准::成对”到“尺寸” 我很困惑,比较器的形式是什么?我认为它应该是任何返回布尔值的东西?我提供的lambda返回一个布尔值 当我移除比较器时,代码仍然会排序,尽管这种效果并不理想,因为按索引排序有一个可预测的结果。您尝试对向

错误如下所示:

1> C:\ProgramFilesx86\Microsoft Visual Studio 11.0\VC\include\algorithm3781:错误C2664:“布尔排序索引::”运算符 size\t,size\t const':无法将参数1从 “标准::成对”到“尺寸”

我很困惑,比较器的形式是什么?我认为它应该是任何返回布尔值的东西?我提供的lambda返回一个布尔值


当我移除比较器时,代码仍然会排序,尽管这种效果并不理想,因为按索引排序有一个可预测的结果。

您尝试对向量进行排序,因此比较器必须比较pair,而不是size\t。

您尝试对向量进行排序,因此比较器必须比较pair,不需要大小。

简单在gcc-4.9中尝试,获得以下信息:

参数1从“std::pair>”到“size_t{aka long unsigned int}”的转换未知


简单结论:您的comp不正确,您需要一个std::pair的比较器。

简单在gcc-4.9中尝试一下,获得以下信息:

参数1从“std::pair>”到“size_t{aka long unsigned int}”的转换未知


简单结论:您的comp不正确,您需要一个std::pair的比较器。

如果按索引排序,则比较器应为:

vector< pair<size_t, tuple<double,double> >>
sort_indexes(const vector<tuple<double,double>> &v)
//takes a list and prepends the sorted inxdex
{
    // Copy data
    vector< pair<size_t, tuple<double,double> >> idx(v.size());
    for (size_t i = 0; i != idx.size(); ++i)
    {
        idx[i].first=i ;
        idx[i].second=v[i];
    }
    sort(idx.begin(), idx.end(),
        [&v](size_t i1, size_t i2) {return get<0>(v[i1]) < get<0>(v[i2]);}
        );
    return idx;
}
否则:

typedef pair<size_t, tuple<double,double> > param;

    sort(idx.begin(), idx.end(), [&v](const param &it, const param &jt) {
        return it.first < jt.first;
    });

如果按指数排序,则应使用比较器:

vector< pair<size_t, tuple<double,double> >>
sort_indexes(const vector<tuple<double,double>> &v)
//takes a list and prepends the sorted inxdex
{
    // Copy data
    vector< pair<size_t, tuple<double,double> >> idx(v.size());
    for (size_t i = 0; i != idx.size(); ++i)
    {
        idx[i].first=i ;
        idx[i].second=v[i];
    }
    sort(idx.begin(), idx.end(),
        [&v](size_t i1, size_t i2) {return get<0>(v[i1]) < get<0>(v[i2]);}
        );
    return idx;
}
否则:

typedef pair<size_t, tuple<double,double> > param;

    sort(idx.begin(), idx.end(), [&v](const param &it, const param &jt) {
        return it.first < jt.first;
    });
在这里

comp-比较函数对象,即满足比较要求的对象,返回​如果第一个参数较少,即排序在第二个元素之前,则为true

比较函数的签名应等同于以下内容:

bool cmpconst类型1和a、const类型2和b

签名不需要常数&,但函数对象不能修改传递给它的对象。 Type1和Type2类型必须使RandomIt类型的对象可以取消引用,然后隐式转换为这两种类型。​

Type1和Type2的类型在代码中是成对的。

此处

comp-比较函数对象,即满足比较要求的对象,返回​如果第一个参数较少,即排序在第二个元素之前,则为true

比较函数的签名应等同于以下内容:

bool cmpconst类型1和a、const类型2和b

签名不需要常数&,但函数对象不能修改传递给它的对象。 Type1和Type2类型必须使RandomIt类型的对象可以取消引用,然后隐式转换为这两种类型。​

Type1和Type2的类型在代码中是成对的