我可以使用std :: vector <std :: vector <t>&gt;用C ++表示二维数组?</std :: vector <t>

时间:2014-07-23 20:19:34

标签: c++ arrays multidimensional-array

我最近学会了如何使用指针在普通C中做二维和三维数组,但是作为C ++爱好者,我还想弄清楚如何用C ++做多维数组。

我知道在C ++中使用一维数组的首选方法是使用std::vector<T>,但二维和三维数组呢?它们会被表示为std::vector<std::vector<T>>std::vector<std::vector<std::vector<T>>>吗?

3 个答案:

答案 0 :(得分:3)

虽然您可以从技术上做到这一点,但最好使用单个std::vector<T>并手动计算偏移量。由此产生的内存布局将更加缓存,因为所有内容都将紧密打包在一起,并且可以顺序遍历或索引而无需间接。

但是,如果C ++ 11是一个选项,并且数组的大小在编译时是固定的,那么您应该使用嵌套的std::array。使用std::unique_ptr可以轻松实现动态分配。但请注意,数据不一定在子阵列之间是严格连续的,这可能是与API接口时期望单个阵列的问题。数据块。

答案 1 :(得分:2)

当然你可以使用class std :: vector来模拟数组。例如

#include <iostream>
#include <vector>

int main() 
{
    size_t n;
    size_t m;

    std::cout << "Enter the number of rows: ";
    std::cin >> n;

    std::cout << "Enter the number of columns: ";
    std::cin >> m;

    std::vector<std::vector<int>> v( n, std::vector<int>( m ) );

    return 0;
}

当列数是编译时常量时,还要考虑使用std :: vector和std :: array的组合。

所谓的三维数组的定义可以看作例如

std::vector<std::vector<std::vector<int>>> 
    v( 2, std::vector<std::vector<int>>( 3, std::vector<int>( 4 ) ) );

一个更有趣的例子

#include <iostream>
#include <vector>
#include <numeric>

int main() 
{
    size_t n;
    size_t m;

    std::cout << "Enter the number of rows: ";
    std::cin >> n;

    std::cout << "Enter the number of columns: ";
    std::cin >> m;

    std::vector<std::vector<int>> v( n, std::vector<int>( m ) );

    for ( size_t i = 0; i < n; i++ )
    {
        std::iota( v[i].begin(), v[i].end(), i * m );
    }

    for ( const auto &v1 : v )
    {
        for ( auto x : v1 ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    return 0;
}

如果相应地为n和m输入3和5,则输出将为

0 1 2 3 4 
5 6 7 8 9 
10 11 12 13 14 

答案 2 :(得分:0)

当然!

#include <vector>
#include <iostream>

int main()
{
    typedef std::vector<double> VD;
    typedef std::vector<VD>    VVD;

    // 10x5 matrix filled with ones
    VVD mtx(10, VD(5, 1));

    std::cout << mtx.size() << " " << mtx[0].size() << std::endl;
    std::cout << mtx[3][2] << std::endl;


    return 0;
}