c++ declare an array of arrays without know the size

后端 未结 4 931
你的背包
你的背包 2021-01-18 14:18

I must declare an array of arrays or multidimensional array without know the size. I want to do something similar that I do in this cases with simple arrays:



        
4条回答
  •  無奈伤痛
    2021-01-18 14:50

    You could use a single std::vector to contain the entire two dimensional array and wrap it in a class to hide the details. Here's an example, it uses a data( row, col ) member function that returns a reference to the element at row and col. I included an example 2 dimensional matrix of int where each entry in the array is initialized to the product of its row and col. When an instance of this class goes out of scope, the default destructor will get called and release the memory, that way you don't have to remember to call delete[] to release the memory. All elements of the matrix will be contiguous in memory, this is cache friendly and should give you good performance.

    #include 
    #include 
    #include 
    
    template 
    class matrix {
        std::vector data_;
    public:
        size_t const rows_;
        size_t const cols_;
        matrix(size_t rows, size_t cols)
            : rows_(rows)
            , cols_(cols)
            , data_( rows * cols )
        {}
        T& data( size_t row, size_t col ) {
            if (row > rows_ || col > cols_) throw std::out_of_range("matrix");
            return data_[ row * cols_ + col ];
        }
    };
    
    int main( int argc, char** argv )
    {
        matrix array(100,100);
    
        for(size_t r=0; r < array.rows_; ++r) {
            for(size_t c=0; c < array.cols_; ++c) {
                array.data(r,c) = r * c;
            }
        }
    
        std::cout << "8 x 7 = " << array.data(8,7) << std::endl;
    
        return 0; // array goes out of scope here, memory released automatically
    }
    

    When you run this you will get

    8 x 7 = 56
    

提交回复
热议问题