【问题标题】:2D array operations using vector使用向量的二维数组操作
【发布时间】:2013-06-06 22:39:12
【问题描述】:

我最近才使用向量,并且在比较普通数组声明时发现它们非常方便。但是,我只处理了以下一维操作:-

      vector<int>X;
      X.push_back(value/variable);

如何对等效的二维向量执行类似操作并逐行动态更新值?如果问题是初步的,请在这里帮助我并道歉。此外,如果您可以向我展示一个链接,其中所有向量操作都作为教程提供,那将非常有帮助。我尝试了几个站点,但它们到处都是。请帮帮我。

【问题讨论】:

    标签: c++ vector multidimensional-array


    【解决方案1】:

    使用二维数组的另一种方法是在您自己的类中使用一个具有二维寻址的向量。

    这里是一个例子:

    #include <iostream>
    #include <vector>
    
    class array_2d
    {
        public:
            array_2d( 
                unsigned int x, 
                unsigned int y ) 
            : 
                m_size_x( x ), 
                m_size_y( y ),
                // resize vector to size x*y, all elements are 0.
                m_data( x*y, 0 )
            {}
    
            int
            get( unsigned int x, unsigned int y ) const
            {
                return m_data[ x + y * m_size_y ];
            }
    
            void
            set( unsigned int x, unsigned int y, int data )
            {
                m_data[ x + y * m_size_y ] = data;
            }
    
        private:
            unsigned int m_size_x;
            unsigned int m_size_y;
    
            std::vector <int> m_data;
    };
    
    int main()
    {
        // 2D array 2x3.
        array_2d m( 2, 3 );
    
        // Set 2 cells into 1 and 3.
        m.set( 1, 1, 1 );
        m.set( 2, 0, 3 );
    
        for( unsigned int i = 0; i < 3; ++i )
        {
            for( unsigned int j = 0; j < 2; ++j )
                std::cout << m.get( i, j ) << " ";
    
            std::cout << std::endl;
        }
        return 0;
    }
    

    【讨论】:

    • 我个人比我的 vector 解决方案更喜欢这个,因为它更有效。但是您必须为此编写更多代码,除了此处完成的坐标转换之外,还可以添加 operator () 或 [] 以便您可以通过执行类似 array2d(1,3) = 7 的操作来访问/修改元素并且 if(array2d(1,3)>5) 仍然是 +1。
    【解决方案2】:

    您需要类似于vector &lt;vector &lt;int&gt; &gt; 的东西,其中内部向量代表一整行。或一整列(只需选择行专业或列专业并坚持下去)。 或者,只需使用 boost::multi_array (http://www.boost.org/doc/libs/1_53_0/libs/multi_array/doc/user.html)

    这是一个例子:

    //#include <iostream>
    #include <stdio.h>
    #include <vector>
    using namespace std;
    
    int main(){
    
    vector <vector <int> > my2d;
    
    vector<int> row;
    
    row.push_back(1); row.push_back(2); row.push_back(3);
    
    my2d.push_back(row);
    
    ++row[1];
    
    my2d.push_back(row);
    
    --row[0];
    
    my2d.push_back(row);
    
    for(size_t r=0;r<my2d.size();r++)
    {
        for(size_t c=0;c<my2d[0].size();c++)
        {
            printf("%d ",my2d[r][c]);
        }
        printf("\n");
    }
    
    getchar();
    
    return 0;
    }
    

    【讨论】:

    • 感谢您的回复。我现在更喜欢使用矢量,因为我已经稍微习惯了。您能告诉我如何在此处使用 push_back 沿列或行逐个更新元素吗?在语法方面?像(0,1),然后(0,2)等等。提前致谢。
    • 如果我想要 3 列并且没有。行数,我该怎么做?
    • 添加了一个例子。我有 3 行和 3 列。我先添加 (1 2 3) 行,然后添加 (1 3 3) 然后添加 (0 3 3) 然后打印整个内容
    猜你喜欢
    • 2020-05-05
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多