Home > Mobile >  c dynamecly fill 2d vector when there is unknown rows or columns
c dynamecly fill 2d vector when there is unknown rows or columns

Time:01-23

i try to understand how can i hold dynamically 2d vector array ( or it can be other container in c ) that i can fill dynameclly when i dont know the row nuber and the column number in each raw what i have now is something like this but as you can see i have to define ahead the number of raws and columns

 std::vector<std::vector<BaseColumn*>> csv(1, std::vector<BaseColumn*> (1));
    std::string test = "d";
    Column<std::string>* tmpString = new Column<std::string>(Types::string,test);
    csv[0].push_back(tmpString);   
    csv[0].push_back(tmpString);
    csv[0].push_back(tmpString);
    csv[1].push_back(tmpString); //<--- Here im getting Segmentation fault
    csv[1].push_back(tmpString); 
    csv[1].push_back(tmpString); 
    csv[1].push_back(tmpString); 


Thread 1 received signal SIGSEGV, Segmentation fault.
0x00007ff655703f1a in std::__new_allocator<BaseColumn*>::construct<BaseColumn*, BaseColumn*> (this=0x1af24052af8, __p=0xabababababababab) at C:/msys64/mingw64/include/c  /12.1.0/bits/new_allocator.h:175
175     { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }

My question is simple how to construct 2d dynaic container ...

CodePudding user response:

std::vector<...> csv(1, ...);

Here you say that the vector have only one element. That means any index that is not equal to 0 will be out of bounds.

You probably want

std::vector<...> csv(2);  // Let the nested vectors be default-initialized and *empty*

If you don't know the size of the vector, at compile-time or at run-time (for example you read rows from a file of an unknown size) then just push back the inner vectors as you read the rows from the file:

std::vector<std::vector<BaseColumn*>> csv;  // Create an empty vector

std::string input_line;
while (std::getline(input_file_stream, input_line))
{
    std::vector<BaseColumn*> one_row = parse_line_into_columns(input_line);
    csv.push_back(one_row);  // Add the row
}
  • Related