What is the most efficient way to initialize a 3D vector?

后端 未结 5 1339
长情又很酷
长情又很酷 2021-02-03 11:23

I have a 3D string vector in C++:

vector>> some_vector

That I am trying is to find a fast method to all

5条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-02-03 11:37

    I added several features to Mike Seymour's code such as dynamically resize the 3d vector and on access/assign bounds checking for data vector.

    template 
    class vector3d 
    {
    public:
        vector3d(size_t d1=0, size_t d2=0, size_t d3=0, T const & t=T()) :
            d1(d1), d2(d2), d3(d3), data(d1*d2*d3, t)
        {}
    
        T & operator()(size_t i, size_t j, size_t k) 
        {
                return (i<=d1 && j<=d2 && k<=d3) ? data[i*d2*d3 + j*d3 + k] 
                                                 : data.at(i*d2*d3 + j*d3 + k);
        }
    
        T const & operator()(size_t i, size_t j, size_t k) const 
        {
            return data[i*d2*d3 + j*d3 + k];
        }
    
        void resize(const size_t _d1=0, const size_t _d2=0, const size_t _d3=0)
        {
            data.resize(_d1*_d2*_d3);
            d1=_d1;
            d2=_d2;
            d3=_d3;
        }
    
        void shrink_to_fit()
        {
            data.shrink_to_fit();
        }
    
        const size_t length() const
        {
            return data.size();
        }
    
        const size_t capacity() const
        {
            return data.capacity();
        }
    
        const size_t x() const
        {
            return d1;
        }
    
        const size_t y() const
        {
            return d2;
        }
    
        const size_t z() const
        {
            return d3;
        }
    
    
    private:
        size_t d1,d2,d3;
        std::vector data;
    };
    

    Usage:

    vector3d vec3d(2,2,2,31); //create 2x2x2 3d vector and fill it with 31
    vec3d(1,1,2)=45;               //assign 45 at vec3d(1,1,2)
    vec3d.resize(2,2,1);           //resize the vec3d to 2x2x1
    vec3d(1,2,2)=67;               //error (its out of bounds)
    

提交回复
热议问题