我正在玩矢量并偶然发现不同类型的二维矢量。有人请指出这些矢量声明之间的主要区别。
其中哪一个实际上是二维矢量 -
//c++ format
//All libraries preincluded
1) std::vector <int,int> v1;
2) std::vector <pair<int,int>> v2;
3) std::vector <int> v(10);
4) struct node{
int a,b;
}
std::vector<node> v4;
5) std::vector< vector<int> > v5;
答案 0 :(得分:0)
答案不是以上所述。
没有2D vector
这样的东西。所有vectors
都是1D,但可能包含具有其他维度外观的对象。
考虑选项5.这是vector
,其中包含其他vector
,当使用时肯定可以看到2D。外部vector
提供一个维度,而包含vector
s提供另一个维度。但它不是2D vector
。它是vector
的{{1}}。
vectors
语法无效。这指定分配器为std::vector <int,int> v1;
类型,并可能导致几页奇怪的错误消息。
int
将提供N x 2矩阵,但访问这些对是很麻烦的std::vector <pair<int,int>> v2;
?呸。
v2[n].first
这是一维矢量,但如果您愿意自己做数学运算,可以将其视为5x2矩阵:std::vector <int> v(10);
v[row*2+column]
几乎与选项2完全相同。struct node{
int a,b;
}
std::vector<node> v4;
不错,但可能更好。
v4[n].a
以上涵盖。这具有优点,但允许非矩形形状并且具有可怕的高速缓存性能,因为许多std::vector< vector<int> > v5;
中的每一个都是它自己的拥有自己内存的野兽,并且该内存可能分散在整个存储中。阅读空间局部性,看看为什么这很糟糕。
我选择选项6
vector
这是所有连续存储,看起来像一个N x 2矩阵:std::vector<int[2]> v6;
。
答案 1 :(得分:0)
std::vector<int,int> v1
这是非法语法,std::vector
只保存单一类型的数据 - 第二个模板参数可用于自定义分配器对象。
std::vector<std::pair<int,int>> v2
这声明了std::vector
,其中包含std::pair<int,int>
类型的对象,以便向量的每个元素在对结构中保存两个整数。
std::vector<int> v(10)
构造std::vector
个int
类型,其中包含10个默认插入的int
实例。
std::vector<node> v4
声明std::vector
持有node
类型的对象,其中node
在您的问题中定义。每个节点都有两个公共int
字段,因此其行为与std::vector<std::pair<int,int>>
类似。
std::vector< std::vector<int> > v5
这声明了std::vector
个std::vector<int>
个对象,v5
是&#34; 2d向量&#34; (我松散地使用该术语,从技术上讲它并非真正的2d) - 即v5
的每个元素都包含std::vector<int>
个对象。
答案 2 :(得分:-1)
非法?
N by 2 vectors
2)4)5)以不同方式访问细胞。假设您要访问第x行,第y列的单元格:
2)y == 0:v2 [x] .first; y == 1 v2 [x] .second
4)y == 0:v4 [x] .a; y == 1 v4 [x] .b
5)v5 [x] [y]