ram*_*ram 5 c++ sorting algorithm stl vector
我正在尝试使用另一个向量v2对向量v1进行排序.我无法解决这个错误:
在抛出'std :: out_of_range'的实例后调用终止
what():vector :: _ M_range_check
Abort trap
在运行此代码时:
#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;
}
Run Code Online (Sandbox Code Playgroud)
v1并且v2大小相同.为什么out_of_range错误?
提前感谢任何指针.
我相信你的问题就在这一行:
bool operator()(int i, int j) {return (_V.at(i)<_V.at(j));}
Run Code Online (Sandbox Code Playgroud)
问题是当std::sort算法使用自定义回调时,它会传递存储在vector特定位置的实际值,而不是其中的那些位置的索引vector.结果,当你打电话
sort(v1.begin(), v1.end(), Comp(v2)); // sort v1 according to v2
Run Code Online (Sandbox Code Playgroud)
Comp您编写的比较器将作为参数传递给存储在v1向量中的值,然后尝试将这些位置索引到v2向量中.由于值v1大于大小v2,因此调用_V.at(i)将导致out_of_range抛出异常.
如果要相对于彼此对两个范围进行排序,则需要采用不同的方法.我不知道这样做的直截了当的方式,但如果我想到一个,我会告诉你的.
大小v1只是3,但你使用的每个值v2作为索引v1.并且因为v2有一个9大于大小的值v1,这就是std::out_of_range错误:
bool operator()(int i, int j) {return (_V.at(i)<_V.at(j));}
Run Code Online (Sandbox Code Playgroud)
std::vector::at函数给出std::out_of_range了传递给它的索引的异常,因为参数大于向量的大小.也就是说,索引必须小于vector::size().
| 归档时间: |
|
| 查看次数: |
2427 次 |
| 最近记录: |