我正在开发一个基于它的第一列对2d向量进行排序的代码。该代码在输入上给出了分段错误
6
7 1 3 4 1 7
代码:
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
bool sortcol(const vector <int> v1,const vector <int> v2){
return v1[0]<v2[0];
}
int main() {
int n;
cin>>n;
vector < vector<int> > v(n);
for(int i=0;i<n;i=i+1){
vector <int> temp2;
int temp;
cin>>temp;
temp2.push_back(temp);
temp2.push_back(i);
v.push_back(temp2);
}
sort(v.begin(),v.end(),sortcol);
return 0;
}
答案 0 :(得分:3)
问题在于你的向量声明:
vector<vector<int>> v(n);
它不仅仅保留n
个点,它会在里面创建一个带有n
个空向量的向量。因此,对sortcol
中的任何一个空条目的第一次调用会产生未定义的行为,因为
return v1[0] < v2[0];
在零位置引用不存在的元素。
用
替换声明vector<vector<int>> v;
解决此问题。如果您想为n
条目保留空间,请在声明后添加对vector::reserve
的呼叫:
vector<vector<int>> v;
v.reserve(n);
您还应该通过const引用将向量传递给比较器,而不是通过const值。
答案 1 :(得分:3)
问题是你在这种特殊情况下试图保留错误的方法。使用
v.reserve(n);
代替。
答案 2 :(得分:1)
您的比较器有两个问题:
bool sortcol(const vector <int> v1,const vector <int> v2){
return v1[0]<v2[0];
}
它不会检查传递给它的向量是否至少有一个元素
你应该通过const引用传递向量(这不是错误,但可能导致性能问题)
所以在你的代码中:
vector < vector<int> > v(n);
使用v
空向量创建n
,然后在其后推送其他数据。然后你尝试对它进行排序,当你的比较器击中你创建的空矢量时,你会得到UB。