在 2D 向量中输入值时发生核心转储错误

core dumped error while inputting value in 2D vector

c++代码

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    int N;
    vector<vector<int>> arr;
    cin >> N;
for(int i = 0; i < N; i++)
{
    for(int j = 0; j < 2; j++)
    {
        int a;
        cin >> a;
        arr[i].push_back(a); 
    }
}


return 0;
}

当我在二维向量中输入值时,出现错误(核心已转储)。

例如)

编译器(输入)

3
1 3
segmentation error(dore dumped)

我该如何修复它?

[推荐] 只需这样做:参考。 Range-based for loop

#include <iostream>
#include <vector>

int main() {
    int N;
    std::cin >> N;
    std::vector<std::vector<int>> arr(N, std::vector<int>(2));
    for (auto &&row : arr)
        for (auto &&ele : row)
            std::cin >> i;
}

你的代码的问题是,你没有告诉编译器向量中有多少个元素。

更正后的代码:

// ...
int main() {
    int N;
    cin >> N;
    vector<vector<int>> arr(N);
    for (int i = 0; i < N; i++) {
// ... 

另一种修复代码的方法:

添加

        arr.push_back(vector<int>());

就在内部循环之前:

        for (int j = 0; j < 2; j++) {

另一种方式:

添加

    arr.resize(N); // https://en.cppreference.com/w/cpp/container/vector/resize

就在外循环之前:

    for (int i = 0; i < N; i++) {

奖金提示:

如果您的数据仅限于两列,那么您可以考虑使用 std::pair 代替:

#include <iostream>
#include <utility>
#include <vector>

int main() {
    int N;
    std::cin >> N;
    std::vector<std::pair<int, int>> arr(N);
    for (auto &&i : arr)
        std::cin >> i.first >> i.second;
}

因为您在 arr 中评估越界,请查看调整大小 here or here

#include<iostream>
#include<vector>

using namespace std; // don't do this

int main ()
{
  int N;
  vector < vector < int > > arr;
  cin >> N;
  
  arr.resize(N); // resize, without this arr have size 0
  
  for (int i = 0; i < N; i++)
  {
      for (int j = 0; j < 2; j++)
      {
        int a;
        cin >> a;
        arr[i].push_back (a);
      }
  }

  
  for(const auto &vec : arr)
  {
      for(auto i : vec)
      {
          std::cout<<i;
      }
  }

  return 0;
}

如果您对范围循环不满意,请参阅

更好的代码:

#include<iostream>
#include<vector>

int main ()
{
  int N;
  std::cin >> N;
  
  std::vector<std::vector<int>> arr(N, std::vector<int>(2)); //allocate once
  
  for( auto &vec: arr)
  {
      for( auto &v: vec )
      {
          std::cin >> v;
      }
  }

  for ( const auto & vec:arr )
  {
      for ( auto i:vec )
      {
          std::cout << i;
      }
  }

  return 0;
}

查看向量的初始化向量here