数组中向量的 C++ CodeBlock 问题

问题描述

我无法使用 CodeBlock 20.03 修改向量数组中的向量。这是代码的“简化”版本:

#include <iostream>
#include <vector>
#include <stdio.h>

using namespace std;

vector<int> neighbor_fields[500000];
int main()
{
    neighbor_fields[0].push_back(0);

    return 0;
}

程序运行正常,但程序完成后显示错误“Terminated with status -1073741510”。我做了一些研究,这个脚本在 C++ 中似乎是完全合法的。

我认为这是一个与 CodeBlock/compiler(gcn gcc) 相关的问题,因为它在其他地方编译得很好。

谢谢。

编辑: 我已经更正了代码(它应该是一个向量数组而不是单个向量)。另一个有趣的事情是对单个向量执行 push_back 也会以该错误代码终止:

#include <iostream>
#include <vector>
#include <stdio.h>

using namespace std;

vector<int> neighbor_fields;
int main()
{
    neighbor_fields.push_back(0);
    return 0;
}

解决方法

cppreference:vector operator[]所示,通过该运算符访问不存在的元素是未定义行为。

对于您的情况,neighbor_fields[0] 表示它访问向量的第一个元素,该元素不存在并导致错误。

应该是:neighbor_fields.push_back(0);

,

这段代码有两个误解:

  1. 当您声明 neighbor_fields 时,您创建了一个容器,但您没有在其中放置任何东西。因此,如果您尝试访问容器的某个项目,您将获得未定义的行为,如果您想让程序更安全,您可以使用 std::vector::at,它的工作方式类似于 std::vector::operator[],但是当索引为超出范围抛出一个例外,以便您可以处理它。

  2. std::vector::operator[] 返回对容器存储类型变量的引用,在我们的例子中为 int,您不能在 int 变量上使用 push_back(),但您可以使用它用于在容器中添加项目。 您正在寻找的代码是

    std::vector neighbor_fields;

    int main() {

      neighbor_fields.push_back(0); 
    
      return 0;
    

    }

此代码创建一个容器并添加值 0。您可以假设 std::vector 类似于类似 c 的数组,因此 int array[10],但可以更改添加和删除项目的大小。>

我很抱歉代码,但我无法将其标记为我们的代码