分段错误:从二维向量中随机删除元素

Posted

技术标签:

【中文标题】分段错误:从二维向量中随机删除元素【英文标题】:Segmentation fault: randomly removing elements from 2d vector 【发布时间】:2017-04-24 20:11:36 【问题描述】:

给定一个二维向量,我想随机检索然后删除一个元素,重复这个过程直到向量为空。

但是,我的代码在运行时返回 Segmentation fault: 11 错误,每次都在循环中的不同点。这告诉我代码正在尝试从不再存在的索引中检索元素,并且我一直在考虑解析索引或错误删除元素的方法。

关于如何解决此问题的任何建议?

#include <vector>
#include <iostream>

int main(void) 

    int X_LENGTH = 4;
    int Y_LENGTH = 4;
    std::vector<std::vector<long> > arrayCellDistance(X_LENGTH, std::vector<long>(Y_LENGTH, 0));

    // Assign values to array, print them out in order
    for (int i = 0; i < X_LENGTH; i++) 
        for (int j = 0; j < Y_LENGTH; j++) 
            arrayCellDistance[i][j] = (i+j)/2 + i*j;
            std::cout << "arrayCellDistance[" << i << "][" << j << "] = " << arrayCellDistance[i][j] << std::endl;
        
    

    std::cout << "===============================================" << std::endl;

    int x, y;
    srand(time(NULL));

    while (!arrayCellDistance.empty()) 

        y = (rand() % (int)(arrayCellDistance.size())); // Rand from 0 to number of rows
        x = (rand() % (int)(arrayCellDistance[y].size())); // Rand from 0 to number of columns in row

        // 'Retrieve' value from array and then delete this value
        std::cout << "arrayCellDistance[" << x << "][" << y << "] = " << arrayCellDistance[x][y] << std::endl;

        arrayCellDistance[y].erase(arrayCellDistance[x].begin() + 1); // Remove element

    

    return 0;

删除后打印出矩阵时,我得到以下输出:

arrayCellDistance[0][1] = 0
0 1 1 0 
2 3 5 
1 3 6 8 
1 5 8 12 
arrayCellDistance[2][2] = 6
0 1 1 0 
2 3 5 
1 6 8 
1 5 8 12 
arrayCellDistance[1][1] = 3
0 1 1 0 
2 5 
1 6 8 
1 5 8 12 
arrayCellDistance[2][2] = 8
0 1 1 0 
2 5 
1 8 
1 5 8 12 
arrayCellDistance[1][0] = 2
Segmentation fault: 11

如您所见,当程序尝试删除第二行中的2 时,会出现分段错误 - 因此,由于仍然存在“行”向量,如果它仍然无法访问任何行?

【问题讨论】:

arrayCellDistance.size() + 1 - 1?为什么不简单地arrayCellDistance.size() 考虑您的条件语句while(!arrayCellDistance.empty()) 是否处理第一级向量不为空但第二级向量之一为空的情况,然后您尝试从第二级向量中删除一个元素? @Borgleader 很好 - 当包含+1 时,随机函数会产生[0, arrayCellDistance.size()] 范围内的整数,但也会尝试越界访问索引,因此将-1 添加到将范围更改为[0, arrayCellDistance.size() - 1] @ChristopherPisz 我认为当二级向量中的所有元素都被擦除时,二级向量本身也被擦除,我错了吗? @Daniel 二级向量将保留,它会是空的,但它仍然存在。所以,如果你再次尝试删除它,我想你会让电脑生气。 【参考方案1】:

我现在手头没有编译器,但我认为您正在寻找类似的东西:

while (!arrayCellDistance.empty())

    y = (rand() % (int)(arrayCellDistance.size() ));    // Rand from 0 to number of rows

    if( arrayCellDistance[y].empty() )
    
        // Error - Contained empty second-level vector initially.
        break;
    

    x = (rand() % (int)(arrayCellDistance[y].size() )); // Rand from 0 to number of columns in row

    // Get value from array and display
    std::cout << "arrayCellDistance[" << x << "][" << y << "] = " << arrayCellDistance[x][y] << std::endl;

    // Remove element of second-level vector
    arrayCellDistance[y].erase( arrayCellDistance[y].begin() + x );

    // Remove empty first-level vector
    if( array[y].empty() )
    
        arrayCellDistance.erase( arrayCellDistance.begin() + y );
    

我们要确保我们正在处理空的二级向量,而不是在它们变为空后尝试从它们中删除。所以,这段代码在一个空向量变为空后将其移除。

【讨论】:

以上是关于分段错误:从二维向量中随机删除元素的主要内容,如果未能解决你的问题,请参考以下文章

这段代码有啥错误,在二维向量中如何添加额外的元素?

尝试访问二维向量元素时出现段错误

C ++中动态分配的向量中的分段错误

奇怪的分段错误

没有指针的 C++ 分段错误 (HackerRank)

当我尝试从双向链表中删除最后一个元素时,为啥会收到“信号 SIGSEGV,分段错误”?