在 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
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