user2878007
user2878007

Reputation: 419

How can I resize a 2D C++ vector?

I have a 2D char vector:

vector< vector<char> > matrix;

I will read in a matrix as an input and store it in that vector. The size of my vector is fixed and is ROW x COL. I guess I need to resize it for each row and column.

How can I accomplish it without taking extra memory (resizing it correctly)?

Upvotes: 14

Views: 46672

Answers (3)

leemes
leemes

Reputation: 45745

Given the vector is empty, you can simply resize the outer vector with preallocated inner vectors without the need of a loop:

matrix.resize(ROW, vector<char>(COL));

Alternatively, when initializing or if you want to reset a non-empty vector, you can use the constructor overload taking a size and initial value to initialize all the inner vectors:

matrix = vector<vector<char> >(ROW, vector<char>(COL));

I assumed you access it with matrix[row][col]. In C++ matrices are usually stored in row-major order. If you wanted column-major order, you need to swap the arguments ROW and COL.

Upvotes: 32

wtom
wtom

Reputation: 575

While construction with sized vector as default value, given by @leemes, is quite an answer, there is an alternative without using an additional vector and copy ctor:

assert(COL >= 0);
assert(ROW >= 0);
vector<vector<char>> matrix;
for (size_t i{0}; i != COL; ++i)
{
    matrix.emplace_back(ROW);
}

Upvotes: 0

Vlad from Moscow
Vlad from Moscow

Reputation: 311146

    const size_t ROW = 10;
    const size_t COL = 20;
    std::vector<std::vector<char>> v;

    v.resize( ROW );

    std::for_each( v.begin(), v.end(), 
                   std::bind2nd( std::mem_fun_ref( &std::vector<char>::resize ), COL ) );

    std::cout << "size = " << v.size() << std::endl;
    for ( const std::vector<char> &v1 : v ) std::cout << v1.size() << ' ';
    std::cout << std::endl;

Upvotes: 1

Related Questions