Reputation: 419
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
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
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
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