Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有3列和未声明行数的二维向量_C++_Declare_2d Vector - Fatal编程技术网

C++ 具有3列和未声明行数的二维向量

C++ 具有3列和未声明行数的二维向量,c++,declare,2d-vector,C++,Declare,2d Vector,如何声明具有以下规格的二维向量: 应该有3列(当然不是实际的,但仍然是) 未声明的行数 有人建议我将数组包装在向量中,如下所示: typedef array <float, 3> Point vector <Point> 2DVector typedef数组点 向量2DVector 但是有没有一种方法可以仅使用矢量来获得所需的2D矢量 如何使用以下规范声明二维向量:[…] 混合使用std::vector和

如何声明具有以下规格的二维向量:

  • 应该有3列(当然不是实际的,但仍然是)

  • 未声明的行数

  • 有人建议我将数组包装在向量中,如下所示:

                    typedef array <float, 3> Point
                    vector <Point> 2DVector
    
    typedef数组点
    向量2DVector
    
    但是有没有一种方法可以仅使用矢量来获得所需的2D矢量

    如何使用以下规范声明二维向量:
    […]

    混合使用
    std::vector
    std::array
    完全可以满足以下要求:

    using table = std::vector<std::array<float, 3>>;
    table 2d_vector;
    

    使用
    初始值设定项\u list
    可能如下所示

    // using a variable type of initializer_list
    std::initializer_list<float> row = {1,2,3};
    std::vector<std::initializer_list<float>> vec{ row };
    
    row = {4,5,6}; // change list
    
    vec.push_back(row); // add rows
    vec.push_back({7,8,9});
    
    for (auto list: vec){
    
        for(auto value: list){
    
            std::cout<< value <<" ";
    
        }
    
        std::cout<<"\n";
    }
    
    //access without looping
    const float *element = vec[0].begin(); 
    // pointer to first row, first element (value: 1)
    
    element+=3;
    // point to second row, first element (value: 4)
    
    std::cout<<"\nElement("<<*element<<")\n";
    
    // access the same element with x,y coords = (0,1)
    int x = 0, y = 1;
    std::cout<<"\ncoord(0,1) = "<< *(vec[y].begin() + x) << "\n";
    
    第一个
    #包括


    一个更干净的方法可以这样做

    // using a variable type of initializer_list
    std::initializer_list<float> row = {1,2,3};
    std::vector<std::initializer_list<float>> vec{ row };
    
    row = {4,5,6}; // change list
    
    vec.push_back(row); // add rows
    vec.push_back({7,8,9});
    
    for (auto list: vec){
    
        for(auto value: list){
    
            std::cout<< value <<" ";
    
        }
    
        std::cout<<"\n";
    }
    
    //access without looping
    const float *element = vec[0].begin(); 
    // pointer to first row, first element (value: 1)
    
    element+=3;
    // point to second row, first element (value: 4)
    
    std::cout<<"\nElement("<<*element<<")\n";
    
    // access the same element with x,y coords = (0,1)
    int x = 0, y = 1;
    std::cout<<"\ncoord(0,1) = "<< *(vec[y].begin() + x) << "\n";
    

    我能想到的问题(假设它有任何价值)是:

    1) 数据初始化为常量
    浮动
    ,据我所知,您无法更改它们。


    2) 如果将
    列表
    更改为等于
    {0,1,2,3,4,5}
    则现在有3列以上。

    向量向量?包含
    结构的向量
    ?或者你的意思是只想使用一个向量,而不想使用其他数据结构或容器?@Joachim。是向量的向量。是的,我只想使用向量。所以使用向量向量(虽然数组解决方案对我来说更好)。你对此有什么特别的问题吗?@deepak09027好的,谢谢,我只是想确保我在尝试发布答案之前理解正确,当你说它应该有3列时,你的意思是它必须只有3列,或者如果行和列可以是任意长度,这是一个解决方案吗?(您只需要使用3列)并且您是否愿意在向量中使用
    初始值设定项列表
    。它应该只“使用”三列。我对输入的初始值设定项\u list.Thanx没有问题。我不希望数据被初始化为常量浮点,并且以后不能更改它们。但它提供了信息。不用担心,如果你需要一个恒定的2d向量,你可能会想到:)在声明函数之前,我正在写“使用命名空间std”。是否仍有问题?@deepak09027,不要使用
    使用命名空间std
    。只需在STL类/函数/对象前面加上
    std::
    std::vector<std::initializer_list<float>> vec{ {1,2,3} };
    vec.push_back( {4,5,6} ); // add a row
    
    for (auto list: vec){
    
        for(auto element: list){
    
            std::cout<< element << " "; // access each element
    
        }
    
        std::cout<<"\n";
    }
    
    // access first row (y coord = 0), second element (x coord = 1, also the column)
    std::cout<< "vec[0].begin() + 1 = (addr:" << (vec[0].begin() + 1)
             << " - value: " << *(vec[0].begin() + 1) << ')';
    
    1 2 3
    4 5 6
    vec[0].begin() + 1 = (addr:0x40a0d4 - value: 2)
    
    // using a variable type of initializer_list
    std::initializer_list<float> row = {1,2,3};
    std::vector<std::initializer_list<float>> vec{ row };
    
    row = {4,5,6}; // change list
    
    vec.push_back(row); // add rows
    vec.push_back({7,8,9});
    
    for (auto list: vec){
    
        for(auto value: list){
    
            std::cout<< value <<" ";
    
        }
    
        std::cout<<"\n";
    }
    
    //access without looping
    const float *element = vec[0].begin(); 
    // pointer to first row, first element (value: 1)
    
    element+=3;
    // point to second row, first element (value: 4)
    
    std::cout<<"\nElement("<<*element<<")\n";
    
    // access the same element with x,y coords = (0,1)
    int x = 0, y = 1;
    std::cout<<"\ncoord(0,1) = "<< *(vec[y].begin() + x) << "\n";
    
    1 2 3
    4 5 6
    7 8 9
    
    Element(4)
    
    coord(0,1) = 4