C++ 将_推回2D向量是seg断层作用

C++ 将_推回2D向量是seg断层作用,c++,vector,C++,Vector,我试图用x和y对点向量进行排序,这样得到的向量将从左到右,从上到下读取。我最初的想法是只按一个排序,然后另一个以无序向量结束,因此我决定按一排序,然后将具有相同x坐标的每组点放入向量向量中的一个单独向量中。在分割之后,我将对每个向量分别进行排序 我的else-if语句很复杂,因为我收集点的方式会产生不可避免的错误 void sortPoints(vector<Point> coor, vector< vector<Point> >& output) {

我试图用x和y对点向量进行排序,这样得到的向量将从左到右,从上到下读取。我最初的想法是只按一个排序,然后另一个以无序向量结束,因此我决定按一排序,然后将具有相同x坐标的每组点放入向量向量中的一个单独向量中。在分割之后,我将对每个向量分别进行排序

我的else-if语句很复杂,因为我收集点的方式会产生不可避免的错误

void sortPoints(vector<Point> coor, vector< vector<Point> >& output) {
    sort(coor.begin(), coor.end(), sortY);
    int j = 0;
    for(int i = 0; i < coor.size(); i++) {
        Point co = coor[i];
        if(i == 0) { output[j].push_back(co); }
        else if((co.x == coor[i-1].x) || ((co.x - 1) == coor[i-1].x) || 
            (co.x == (coor[i-1].x - 1)) || ((co.x - 2) == coor[i-1].x) || 
                (co.x == (coor[i-1].x - 2))) {
            output[j].push_back(co);
        }
        else j++;
    }
}
void排序点(向量coor,向量&output){
排序(coor.begin()、coor.end()、sortY);
int j=0;
对于(int i=0;i
我知道seg故障发生在输出[j]期间。推回(co)


我已经查过语法,并确保我的声明是正确的,看起来一切都很好。我在想也许是因为点的向量?非常感谢您的帮助。谢谢。

之所以会发生segfault,是因为您没有进入向量的向量,而是在

output[j].push_back(co);
您正试图推入
向量
输出[j]
。然而(这里我不得不猜测,因为您没有显示如何初始化
output
),似乎在尝试使用它之前,您没有在
j
位置创建向量

你需要像这样的东西:

std::vector<Point> temp;
temp.push_back(co);
output.push_back(temp);
std::向量温度;
温度推回(co);
输出。推回(温度);

如何声明
输出
?它是否有足够的空间使
output[j]
有效?我已经查找了语法--
output[j]。push_back(
--将其更改为
output.at(j)。push_back(
)。我打赌您届时会看到问题,不会出现seg故障(将引发异常而不是seg故障)。我们可以很好地猜测错误所在,但如果没有答案,我们只能猜测。如果您制作了一个MCVE来将此转化为一个好问题,我的钱就花在您自己通过制作MCVE来发现并解决错误上。您也有可能找到改进代码的方法。@0x499602D2声明与在函数声明中,它允许我使用“output[i][j]”和“output[i].begin()”,因此我认为这是有效的。解决此问题的适当MCVE可以简单到
#include int main(){std::vector vec;vec[0]=42;}
,如果你还没有找到问题所在,你就没有阅读任何可信的
vector
文档。难道“output[j]”不应该让push_-back命令将一个点推到向量j中吗?@tydcghk
output[j]
正在访问一个还没有向量的索引。
输出
是一个
向量
。在将
推入向量之前,您需要创建一个
向量
,如答案所示或通过调用
输出。调整大小(向量的数量)
或通过正确初始化
输出