使用三维矢量的问题
Problems using 3-dimensional vector
如何在C++中使用三维向量?
vector<vector<vector<int> > > vec (1,vector<vector<int> >(1,vector <int>(1,12)));
当我尝试类似的东西时
cout << vec[0][0][0]; vec[0][0][1] = 13;
一切都很好。
问题是我只能更改最后的元素。如果我尝试访问第一个和第二个元素,比如这个
vec[0][1][0] = 13;
或者这个
vec.push_back(vector<vector<int > >());
vec[0].push_back(vector<int>());
v[1][0].push_back(13);
我的程序崩溃了。
如何在三维矢量中添加和访问元素?
我永远不会做vector<vector<vector<int> > >
,因为这样你会有很多可能很昂贵的分配。我会简单地将vector<int>
与智能索引一起使用(例如:见下文)。如果您将使用基于double
的矩阵,通过这种方式,可以轻松使用英特尔MKL或任何其他BLAS库。
当矩阵大小发生变化时,它的价格会增加复杂性,但你可以在性能上赢得很多。
有用的链接:C++常见问题解答。
static int const M = 16;
static int const N = 16;
static int const P = 16;
inline int& set_elem(vector<int>& m_, size_t i_, size_t j_, size_t k_)
{
// you could check indexes here e.g.: assert in debug mode
return m_[i_*N*P + j_*P + k_];
}
inline const int& get_elem(const vector<int>& m_, size_t i_, size_t j_, size_t k_)
{
// you could check indexes here e.g.: assert in debug mode
return m_[i_*N*P + j_*P + k_];
}
vector<int> matrix(M*N*P, 0);
set_elem(matrix, 0, 0, 1) = 5;
vector<vector<vector<int> > > vec (1,vector<vector<int> >(1,vector <int>(1,12)));
cout << vec[0][0][0]; vec[0][0][1] = 13;
一切正常。
你错了。一切都不好。向量vec[0][0]
只有一个元素,因此vec[0][0][1]
越界,因此赋值具有未定义的行为。vec[0][1][0] = 13;
和v[1][0].push_back(13)
也有同样的问题
您可以通过只访问向量中存在的索引来解决此问题。如果需要多个元素,则可以先用多个元素构建向量,也可以在构建后推送它们。
在一开始我有1x1x1矢量。那么我该如何推动元素。使用push_back()?例如,我有1x1x1,我想添加v[1][1][0]=2?
如果出于某种原因,您想从int的向量的向量的1x1x1向量开始,并想访问v[1][1][0]
,这里是添加v[1][1][0]
元素的示例代码,对原始向量的更改最小:
// vector of ints that contains one element, 2
// this will vector eventually be the v[1][1] and the integer element will be v[1][1][0]
// since we initialize the integer as 2, there's no need to assign it later though
vector<int> vi(1, 2);
// vector of vectors that contains one default constructed vector
// vvi will eventually be the v[1] element and the default constructed vector will be v[1][0]
vector<vector<int>> vvi(1);
// push vi into vvi, making it vvi[1] and eventually v[1][1]
vvi.push_back(vi);
// push vvi into v, making it v[1]
v.push_back(vvi);
vector<vector<vector<int> > > vec (1,vector<vector<int> >(1,vector <int>(1,12)));
创建具有设置为CCD_ 11的唯一元素的值的CCD_。
要创建类似于M x N x P
矩阵的东西,您需要使用:
vector<vector<vector<int> > > vec (M,vector<vector<int> >(N,vector <int>(P,x)));
这将创建一个M x N x P
矩阵,其中每个元素的值都设置为x
。
相关文章:
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 如何使用qt缩放三维网格
- 三维数组中的C/C++DWORD到BYTE和BYTE到DWORD的转换
- 使用vtkImageReslice重新切片三维原始图像
- 特征:创建一个具有函数的三维阵列
- 扩充矩阵的行缩减-三维样条曲线计算
- 使用pcl transformcloud将三维点平移并旋转到原点
- 用C++从三维矢量中删除元素
- 如何访问CGAL三维三角测量中的面
- 如何在Openscenegraph中从二维鼠标点击的屏幕坐标点计算三维点(世界坐标)
- std::将三维数组复制到三维向量中
- 显示结构的三维数组
- 如何将X 2维数组连接到一个三维阵列中
- 使用unique_ptr来管理三维数组
- 如何访问三维矩阵元素
- 无法访问三维数组中的特定位置
- 使用三维矢量的问题
- C++三维模型io、二进制文件读取(badbit)和#DEN问题
- 将三维指针的第一个地址转换成一维指针时出现问题
- 三维阵列动态分配问题