我正在尝试使用另一个 vector v2对 vector v1进行排序。我无法解决这个错误:



在运行此代码时:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Comp
{
    public:
        Comp(vector<double>& inVec): _V(inVec) {}
        bool operator()(int i, int j) {return (_V.at(i)<_V.at(j));}
    private:
        vector<double> _V;
};

int main(int argc, char** argv)
{
    double x1[] = {90.0, 100.0, 80.0};
    double x2[] = {9.0, 3.0, 1.0};
    vector<double> v1(x1,x1+3);
    vector<double> v2(x2,x2+3);

    sort(v1.begin(), v1.end(), Comp(v2));  // sort v1 according to v2

    for(unsigned int i=0; i<v1.size(); i++)
    {
        cout << v1.at(i) << " " << v2.at(i) << endl;
    }

    return 0;
}
v1v2的大小相同。为什么out_of_range错误?

在此先感谢您提供任何指导。

最佳答案

我相信您的问题出在以下方面:

bool operator()(int i, int j) {return (_V.at(i)<_V.at(j));}

问题在于,当std::sort算法使用自定义回调时,它将传入存储在vector中特定位置的实际值,而不是vector中这些位置的索引。结果,当您打电话时
sort(v1.begin(), v1.end(), Comp(v2));  // sort v1 according to v2

您编写的Comp比较器将作为参数传递给v1 vector 中存储的值,然后尝试在这些位置处索引到v2 vector 中。由于v1中的值大于v2的大小,因此对_V.at(i)的调用将引发out_of_range异常。

如果要相对于两个范围进行排序,则需要采用另一种方法。我不知道执行此操作的直接方法,但是如果有想到的话,我会通知您。

10-04 14:48