用于简单向量操作的 C++ 分段错误核心转储
C++ Segmentation fault core dumped for simple vector operation
我有以下代码c++代码
#include <vector>
#include <iostream>
using namespace std;
#define for_loop(upper_bound) for (int i=0;i<upper_bound; ++i)
// #define SHOW_VECTOR(vec_in) for(int j=0;j<vec_in.size();j++){ cout << vec_in[j] << " " << endl;};
int main(){
int dim_1=10;
int dim_2=3;
int outer_i;
// vector variable declared here to have 10 values
vector<vector<int>>vec_var(dim_1);
for_loop(dim_1){
outer_i = i;
for_loop(dim_2){
cout << outer_i << " " << i << endl;
vec_var[outer_i][i]=103;
}
}
return 0;
}
当我尝试 运行 时,出现以下错误:
Segmentation fault (core dumped)
您需要调整外向量和内向量的大小
vector<vector<int>> vec_var(dim_1, vector<int>(dim_2));
// ^ inner vector default size
否则,如所写,如果大小为 dim_1
,则您有一个外部向量,但所有内部向量都是空的。
顺便说一句,因为我注意到您随后用常数值填充向量,所以您也可以一步完成所有操作
vector<vector<int>> vec_var(dim_1, vector<int>(dim_2, 103));
// ^ default of inner vector elements
下标 std::vector
不会导致创建该元素位置。您需要调整大小,push_back,或以其他方式向矢量添加元素!您为超出范围的内容编制了索引。
外部向量是使用构造函数参数定义的,该参数将其大小设置为 dim_1
,但每个内部向量都没有任何元素。所以跟进:
for (auto& inner : vec_var) inner.resize(dim_2);
此外,建议使用内置的基于范围的 for
循环而不是您的宏。你需要在外循环中手动保存索引说明你的宏并不是最方便的!
int main()
{
constexpr int dim_1=10;
constexpr int dim_2=3;
vector<vector<int>>vec_var(dim_1);
for (auto& outer : vec_var) {
outer.resize (dim_2);
for (auto& inner : outer) {
inner=103;
}
}
return 0;
}
但说真的,这不正常。您可能应该使用 push_back
添加值,而不是调整它的大小,然后按顺序为每个元素下标。
你只设置了外向量的维度。您还需要设置内部向量的维度。
#include <vector>
#include <iostream>
using namespace std;
#define for_loop(upper_bound) for (int i=0;i<upper_bound; ++i)
// #define SHOW_VECTOR(vec_in) for(int j=0;j<vec_in.size();j++){ cout <<
vec_in[j] << " " << endl;};
int main(){
int dim_1=10;
int dim_2=3;
int outer_i;
// vector variable declared here to have 10 values
vector<vector<int>>vec_var(dim_1);
for_loop(dim_1){
outer_i = i;
vec_var[outer_i].resize(dim_2); // ADD THIS
for_loop(dim_2){
cout << outer_i << " " << i << endl;
vec_var[outer_i][i]=103;
}
}
return 0;
}
我有以下代码c++代码
#include <vector>
#include <iostream>
using namespace std;
#define for_loop(upper_bound) for (int i=0;i<upper_bound; ++i)
// #define SHOW_VECTOR(vec_in) for(int j=0;j<vec_in.size();j++){ cout << vec_in[j] << " " << endl;};
int main(){
int dim_1=10;
int dim_2=3;
int outer_i;
// vector variable declared here to have 10 values
vector<vector<int>>vec_var(dim_1);
for_loop(dim_1){
outer_i = i;
for_loop(dim_2){
cout << outer_i << " " << i << endl;
vec_var[outer_i][i]=103;
}
}
return 0;
}
当我尝试 运行 时,出现以下错误:
Segmentation fault (core dumped)
您需要调整外向量和内向量的大小
vector<vector<int>> vec_var(dim_1, vector<int>(dim_2));
// ^ inner vector default size
否则,如所写,如果大小为 dim_1
,则您有一个外部向量,但所有内部向量都是空的。
顺便说一句,因为我注意到您随后用常数值填充向量,所以您也可以一步完成所有操作
vector<vector<int>> vec_var(dim_1, vector<int>(dim_2, 103));
// ^ default of inner vector elements
下标 std::vector
不会导致创建该元素位置。您需要调整大小,push_back,或以其他方式向矢量添加元素!您为超出范围的内容编制了索引。
外部向量是使用构造函数参数定义的,该参数将其大小设置为 dim_1
,但每个内部向量都没有任何元素。所以跟进:
for (auto& inner : vec_var) inner.resize(dim_2);
此外,建议使用内置的基于范围的 for
循环而不是您的宏。你需要在外循环中手动保存索引说明你的宏并不是最方便的!
int main()
{
constexpr int dim_1=10;
constexpr int dim_2=3;
vector<vector<int>>vec_var(dim_1);
for (auto& outer : vec_var) {
outer.resize (dim_2);
for (auto& inner : outer) {
inner=103;
}
}
return 0;
}
但说真的,这不正常。您可能应该使用 push_back
添加值,而不是调整它的大小,然后按顺序为每个元素下标。
你只设置了外向量的维度。您还需要设置内部向量的维度。
#include <vector>
#include <iostream>
using namespace std;
#define for_loop(upper_bound) for (int i=0;i<upper_bound; ++i)
// #define SHOW_VECTOR(vec_in) for(int j=0;j<vec_in.size();j++){ cout <<
vec_in[j] << " " << endl;};
int main(){
int dim_1=10;
int dim_2=3;
int outer_i;
// vector variable declared here to have 10 values
vector<vector<int>>vec_var(dim_1);
for_loop(dim_1){
outer_i = i;
vec_var[outer_i].resize(dim_2); // ADD THIS
for_loop(dim_2){
cout << outer_i << " " << i << endl;
vec_var[outer_i][i]=103;
}
}
return 0;
}