3维向量的不正确索引
Improper indexing of 3 dimensional vector
这是我的功能。基本上它读取一个文本文件并将数据组织成一堆不同的向量。
ctrlpts
是一个 3 维向量。第一层存储不同的控制点集 (cp1..cp3)。第二层存储 x,y,z,w 坐标数组。因此,第三层代表坐标数组中的条目。
在下面的函数中,我首先初始化了所有的向量。然后根据维度 (int d
) 和结向量的数量 (int k
),我相应地构建多维向量。对于 ctrlpts
,我首先将适当的坐标向量添加到适当的控制点集中。 (例如:cpl.push_back(x1)
)然后我将这些坐标集推入 ctrlpts
(例如:ctrlpts.push_back(cp1)
)
调用ctrlpts[0][0][0]
时出现错误。
void createNurb(string filename){
ifstream file;
file.open(filename.c_str());
if(file.fail()){
cout << "Cannot open " << filename << endl;
}
vector<float> knots1;
vector<float> knots2;
vector<float> knots3;
vector< vector<float> > knotvectors;
vector<float> x1;
vector<float> y1;
vector<float> z1;
vector<float> w1;
vector<float> x2;
vector<float> y2;
vector<float> z2;
vector<float> w2;
vector<float> x3;
vector<float> y3;
vector<float> z3;
vector<float> w3;
vector< vector<float> > cp1;
vector< vector<float> > cp2;
vector< vector<float> > cp3;
vector< vector< vector<float> > > ctrlpts;
string line;
getline(file,line);
int d = line[0] - 48;
getline(file,line);
int k= line[0] - 48;
if(k==1){
knotvectors.push_back(knots1);
if(d==1){
cp1.push_back(x1);
cp1.push_back(w1);
}else if(d==2){
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(w1);
}else{
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(z1);
cp1.push_back(w1);
}
ctrlpts.push_back(cp1);
}else if(k==2){
knotvectors.push_back(knots1);
knotvectors.push_back(knots2);
if(d==1){
cp1.push_back(x1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(w2);
}else if(d==2){
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(y2);
cp2.push_back(w2);
}else{
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(z1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(y2);
cp2.push_back(z2);
cp2.push_back(w2);
}
ctrlpts.push_back(cp1);
ctrlpts.push_back(cp2);
}else{
knotvectors.push_back(knots1);
knotvectors.push_back(knots2);
knotvectors.push_back(knots3);
if(d==1){
cp1.push_back(x1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(w2);
cp2.push_back(x3);
cp2.push_back(w3);
}else if(d==2){
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(y2);
cp2.push_back(w2);
cp3.push_back(x3);
cp3.push_back(y3);
cp3.push_back(w3);
}else{
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(z1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(y2);
cp2.push_back(z2);
cp2.push_back(w2);
cp3.push_back(x3);
cp3.push_back(y3);
cp3.push_back(z3);
cp3.push_back(w3);
}
ctrlpts.push_back(cp1);
ctrlpts.push_back(cp2);
ctrlpts.push_back(cp3);
}
for(int i=0; i<k; i++){
getline(file,line);
std::istringstream iss(line);
std::copy(std::istream_iterator<float>(iss),
std::istream_iterator<float>(),
std::back_inserter(knotvectors[i]));
for (int j=0; j<=d; j++){
getline(file,line);
std::copy(std::istream_iterator<float>(iss),
std::istream_iterator<float>(),
std::back_inserter(ctrlpts[i][j]));
}
}
cout<< ctrlpts[0][0][0] << endl;
file.close();
}
如果我调用 knotvectors[0][0]
一切正常,所以我不确定在引用 3 维 ctrlpts
向量的单个单元格时我做错了什么。
对我做错了什么有什么想法吗?也许这与我组装这个 3 维向量的方式有关?
编辑:没有具体的错误信息。它只是崩溃。
编辑 2:
我认为问题可能出在这里:
for (int j=0; j<=d; j++){
getline(file,line);
std::copy(std::istream_iterator<float>(iss),
std::istream_iterator<float>(),
std::back_inserter(ctrlpts[i][j]));
如果我打印出来:ctrlpts[0][0].size()
然后它显示 0。因此,我相信上面的块出于某种原因没有将数据输入向量。
找到问题了。
如果你有向量 A、B 和 C。
如果将B压入A,再将C压入B,则不能直接将数字压入C并通过A访问。而是必须通过A处理:
所以当我最初将控制点集 cpi
推入 ctrlpts
然后更改时,问题已解决:
cp1.push_back(x1);
到
ctrlpts[i].push_back(xi);
这是我的功能。基本上它读取一个文本文件并将数据组织成一堆不同的向量。
ctrlpts
是一个 3 维向量。第一层存储不同的控制点集 (cp1..cp3)。第二层存储 x,y,z,w 坐标数组。因此,第三层代表坐标数组中的条目。
在下面的函数中,我首先初始化了所有的向量。然后根据维度 (int d
) 和结向量的数量 (int k
),我相应地构建多维向量。对于 ctrlpts
,我首先将适当的坐标向量添加到适当的控制点集中。 (例如:cpl.push_back(x1)
)然后我将这些坐标集推入 ctrlpts
(例如:ctrlpts.push_back(cp1)
)
调用ctrlpts[0][0][0]
时出现错误。
void createNurb(string filename){
ifstream file;
file.open(filename.c_str());
if(file.fail()){
cout << "Cannot open " << filename << endl;
}
vector<float> knots1;
vector<float> knots2;
vector<float> knots3;
vector< vector<float> > knotvectors;
vector<float> x1;
vector<float> y1;
vector<float> z1;
vector<float> w1;
vector<float> x2;
vector<float> y2;
vector<float> z2;
vector<float> w2;
vector<float> x3;
vector<float> y3;
vector<float> z3;
vector<float> w3;
vector< vector<float> > cp1;
vector< vector<float> > cp2;
vector< vector<float> > cp3;
vector< vector< vector<float> > > ctrlpts;
string line;
getline(file,line);
int d = line[0] - 48;
getline(file,line);
int k= line[0] - 48;
if(k==1){
knotvectors.push_back(knots1);
if(d==1){
cp1.push_back(x1);
cp1.push_back(w1);
}else if(d==2){
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(w1);
}else{
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(z1);
cp1.push_back(w1);
}
ctrlpts.push_back(cp1);
}else if(k==2){
knotvectors.push_back(knots1);
knotvectors.push_back(knots2);
if(d==1){
cp1.push_back(x1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(w2);
}else if(d==2){
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(y2);
cp2.push_back(w2);
}else{
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(z1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(y2);
cp2.push_back(z2);
cp2.push_back(w2);
}
ctrlpts.push_back(cp1);
ctrlpts.push_back(cp2);
}else{
knotvectors.push_back(knots1);
knotvectors.push_back(knots2);
knotvectors.push_back(knots3);
if(d==1){
cp1.push_back(x1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(w2);
cp2.push_back(x3);
cp2.push_back(w3);
}else if(d==2){
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(y2);
cp2.push_back(w2);
cp3.push_back(x3);
cp3.push_back(y3);
cp3.push_back(w3);
}else{
cp1.push_back(x1);
cp1.push_back(y1);
cp1.push_back(z1);
cp1.push_back(w1);
cp2.push_back(x2);
cp2.push_back(y2);
cp2.push_back(z2);
cp2.push_back(w2);
cp3.push_back(x3);
cp3.push_back(y3);
cp3.push_back(z3);
cp3.push_back(w3);
}
ctrlpts.push_back(cp1);
ctrlpts.push_back(cp2);
ctrlpts.push_back(cp3);
}
for(int i=0; i<k; i++){
getline(file,line);
std::istringstream iss(line);
std::copy(std::istream_iterator<float>(iss),
std::istream_iterator<float>(),
std::back_inserter(knotvectors[i]));
for (int j=0; j<=d; j++){
getline(file,line);
std::copy(std::istream_iterator<float>(iss),
std::istream_iterator<float>(),
std::back_inserter(ctrlpts[i][j]));
}
}
cout<< ctrlpts[0][0][0] << endl;
file.close();
}
如果我调用 knotvectors[0][0]
一切正常,所以我不确定在引用 3 维 ctrlpts
向量的单个单元格时我做错了什么。
对我做错了什么有什么想法吗?也许这与我组装这个 3 维向量的方式有关?
编辑:没有具体的错误信息。它只是崩溃。
编辑 2:
我认为问题可能出在这里:
for (int j=0; j<=d; j++){
getline(file,line);
std::copy(std::istream_iterator<float>(iss),
std::istream_iterator<float>(),
std::back_inserter(ctrlpts[i][j]));
如果我打印出来:ctrlpts[0][0].size()
然后它显示 0。因此,我相信上面的块出于某种原因没有将数据输入向量。
找到问题了。
如果你有向量 A、B 和 C。 如果将B压入A,再将C压入B,则不能直接将数字压入C并通过A访问。而是必须通过A处理:
所以当我最初将控制点集 cpi
推入 ctrlpts
然后更改时,问题已解决:
cp1.push_back(x1);
到
ctrlpts[i].push_back(xi);