如何声明具有以下规范的 2D 矢量:
应该有 3 列(当然不是实际上但仍然)
未声明的行数
有人建议我应该将一个数组包装在一个向量中,如下所示:
typedef array <float, 3> Point
vector <Point> 2DVector
但是有没有办法只使用矢量来获得所需的二维矢量?
如何声明具有以下规范的 2D 矢量:
[...]
混合std::vector
和std::array
非常适合要求:
using table = std::vector<std::array<float, 3>>;
table 2d_vector;
但是有没有办法只使用矢量来获得所需的二维矢量?
这里是:
using table = std::vector<std::vector<float>>;
table 2d_vector;
不过,您必须确保仅float
向内部向量添加 3 s。
我需要将该向量返回给一个函数,编译器似乎不明白什么是
vector<array<float>>
嗯,是的,当然不是。std::vector<std::array<float>>
没有命名类型。你可能的意思是:
std::vector<std::array<float, 3>>;
// ^^^
使用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 列。