排序函数中的分段错误

时间:2017-10-30 13:52:26

标签: c++ sorting vector stdvector

我正在开发一个基于它的第一列对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;
}

3 个答案:

答案 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。