2D矢量,包含3列和未声明的行数

时间:2014-01-20 06:29:39

标签: c++ declare 2d-vector

如何使用以下规范声明2D Vector:

  1. 应该有3列(当然不是,但仍然是)

  2. 未声明的行数

  3. 有人建议我应该在一个向量中包含一个数组,如下所示:

                    typedef array <float, 3> Point
                    vector <Point> 2DVector
    

    但有没有办法只使用矢量来获得所需的2D矢量?

2 个答案:

答案 0 :(得分:1)

  

如何使用以下规范声明2D矢量:[...]

std::vectorstd::array的混合完全符合要求:

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

  

但有没有办法只使用矢量来获得所需的2D矢量?

这是:

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

你必须确保只向内部向量添加3 float


  

我需要将该向量返回给函数,编译器似乎不明白什么是vector<array<float>>

嗯,是的,当然不是。 std::vector<std::array<float>>未命名类型。你可能意味着:

std::vector<std::array<float, 3>>;
//                          ^^^

答案 1 :(得分:1)

使用initializer_list看起来像这样;

首先#include <initializer_list>

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";
}

使用(x,y)坐标获取单个元素;

// 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

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

1)数据被初始化为常数floats,据我所知你不能改变它们。
和 2)如果您将list更改为等于{0,1,2,3,4,5},则现在您的列数超过3列。