如何在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矢量中的元素?
答案 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
。