使用三维矢量的问题

Problems using 3-dimensional vector

本文关键字:问题 三维      更新时间:2023-10-16

如何在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