具有 3 列和未声明行数的 2D 向量
Posted
技术标签:
【中文标题】具有 3 列和未声明行数的 2D 向量【英文标题】:2D Vector with 3 columns and undeclared number of rows 【发布时间】:2014-01-20 06:29:39 【问题描述】:如何声明具有以下规范的二维向量:
应该有 3 列(当然不是实际上但仍然)
未声明的行数
有些人建议我应该将一个数组包装在一个向量中,如下所示:
typedef array <float, 3> Point
vector <Point> 2DVector
但是有没有办法只使用矢量来获得所需的二维矢量?
【问题讨论】:
向量的向量?包含struct
? 的向量还是您的意思是您只想使用单个向量而不使用其他数据结构或容器?
@Joachim。是向量的向量。是的,我只想使用矢量。
所以使用向量的向量(尽管数组解决方案对我来说似乎更好)。你对此有什么特别的问题吗?
@deepak09027 好的,谢谢,我只是要确保我在尝试发布答案之前正确理解您,当您说它应该有 3 列时,您的意思是它必须只有 3 列还是如果行和列可以是任意长度,这将是一个解决方案吗? (并且您只使用 3 列)并且您是否愿意在向量中使用 initializer_list
?
@詹姆斯。它应该只“使用”三列。我对 initializer_list 没有问题。
【参考方案1】:
如何声明具有以下规范的二维向量:
[...]
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;
您必须确保只将 3 个 float
s 添加到内部向量中。
我需要将该向量返回给函数,而编译器似乎不明白
vector<array<float>>
是什么
嗯,是的,当然不是。 std::vector<std::array<float>>
没有命名类型。您可能的意思是:
std::vector<std::array<float, 3>>;
// ^^^
【讨论】:
在声明函数之前,我正在编写“使用命名空间标准”。应该还有问题吗? @deepak09027,不要使用using namespace std
。只需在 STL 类/函数/对象前加上 std::
。【参考方案2】:
使用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 列以上。
【讨论】:
感谢您的输入。我不希望将数据初始化为常量浮点数,然后限制不能更改它们。但它提供了丰富的信息。谢谢。 不用担心,如果您需要一个恒定的 2d 向量,您可能会想到这个 :)以上是关于具有 3 列和未声明行数的 2D 向量的主要内容,如果未能解决你的问题,请参考以下文章
html 手风琴 - 这是一款手风琴,客户可以自行更新。 HTML是一个包含2列和所需行数的表。 ÿ