使用三维矢量的问题

时间:2015-03-27 16:31:01

标签: c++ vector

如何在C ++中使用3维向量?

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);

我的程序崩溃。

如何添加和访问3d矢量中的元素?

3 个答案:

答案 0 :(得分:4)

我永远不会vector<vector<vector<int> > >,因为这样你有很多可能很昂贵的分配。我只想使用vector<int>智能索引(例如:见下文)。如果您将使用基于double的矩阵,则可以使用intel MKL或任何其他BLAS库轻松使用。

当矩阵大小改变时,它的价格会增加复杂性,但你可以在性能上赢得很多。

有用的链接:C++ FAQ

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;

答案 1 :(得分:2)

vector<vector<vector<int> > > vec (1,vector<vector<int> >(1,vector <int>(1,12)));
cout << vec[0][0][0]; vec[0][0][1] = 13;
  

evething is ok。

你错了。一切都好。向量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?

如果由于某种原因想要从1x1x1向量的向量向量的int开始并想要访问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);

答案 2 :(得分:2)

你有什么,

vector<vector<vector<int> > > vec (1,vector<vector<int> >(1,vector <int>(1,12)));

创建1 x 1 x 1矩阵,其中唯一元素的值设置为12

要创建类似于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