我有这样的结构:
struct element{
char ulica[10];
vector<int> dane[3];
int wolne;
int w;
element *lewy, *prawy, *ojciec;
};
我正在实现一种AVL树。当key是相同的我需要把一些int值放到dane(dane [0],dane [1],dane [2]描述3个不同的值)所以我用
tmp2->dane[0].push_back(number)
EDIT。这里是我向这个向量添加值的代码,它是函数的一半,因为secod half是关于AVL的旋转。
void wstaw_wezel(){
element *tmp2; //tmp2 bedzie ojcem nowo wstawionego elementu
tmp2=korzen;
while(tmp2!=NULL){
if(strcmp(tmp2->ulica, tmp->ulica)<0){
if(tmp2->prawy!=NULL){
tmp2=tmp2->prawy;
}
else{
tmp->ojciec=tmp2;
tmp2->prawy=tmp;
cout<<"Wstawiam pod prawy "<<tmp2->ulica<<endl;
if(tmp2->w!=0) tmp2->w=0;
else tmp2->w=-1;
break;
}
}
else if(strcmp(tmp2->ulica, tmp->ulica)>0){
if(tmp2->lewy!=NULL){
tmp2=tmp2->lewy;
}
else{
tmp->ojciec=tmp2;
tmp2->lewy=tmp;
if(tmp2->w!=0) tmp2->w=0;
else tmp2->w=1;
cout<<"Wstawiam pod lewy "<<tmp2->ulica<<endl;
break;
}
}
else{
cout<<"2 bloki na tej samej ulicy"<<endl;
for(int i=0; i<tmp2->dane[0].size(); i++) cout<<tmp2->ulica<<" "<<tmp2->dane[0][i]<<endl;
tmp2->numery.push_back(tmp->numery[0]);
tmp2->dane[0].push_back(tmp->dane[0][0]);
for(int i=0; i<tmp2->dane[0].size(); i++) cout<<tmp2->ulica<<" "<<tmp2->dane[0][i]<<endl;
tmp2->dane[1].push_back(tmp->dane[1][0]);
tmp2->dane[2].push_back(tmp->dane[2][0]);
tmp2->wolne+=tmp->dane[2][0];
break;
}
}
if(tmp->ojciec==NULL){
korzen=tmp;
return;
}
其中tmp2是指向这个结构的指针(我检查了它指向的地方,每次它都是相同的地址)。
哪里有问题?如果我向vector添加新值,那么直到我执行它的循环结束。最后反而有fe。向量中的4个值有一个,即最后一个加值。 Vector不会在最后添加新值,只需替换它。
答案 0 :(得分:2)
您在其构造函数中声明了std :: vector的初始大小,因此可以实现此目的的一种方法是:
struct element
{
char ulica[10];
std::vector<int> dane;
int wolne;
int w;
element *lewy, *prawy, *ojciec;
element() : dane(3) {}
};
如果不包含构造函数,向量的初始大小将为0.无论如何,要向后添加元素,只需使用tmp2->dane.push_back(number);
这将在{{1}中添加值向量number
的后面,这可能导致向量实例的已分配内存量发生变化。
更新:根据OP的评论,他需要三个向量试试这个:
tmp2->dane
要向向量添加元素,只需使用struct element
{
char ulica[10];
std::vector<std::vector<int> > dane;
int wolne;
int w;
element *lewy, *prawy, *ojciec;
element() : dane(3) {}
};
,其中tmp2->dane[i].push_back(number)
是要使用的向量的索引,i
是要添加到number
的新数字} th 向量,这与您在上面的代码段中使用的约定相同。
更新2 :根据以下附加信息,我认为需要重新设计您的数据结构。您正在混合各种组件的含义,并通过更清楚地描述数据元素和AVL数据结构管理的功能,您将能够更清楚地区分这两者。所以试试吧。具有专门用于树节点的“值”部分的数据结构,如:
i
从这里开始创建根节点:
struct house
{
int house_number;
int unique_value0;
int unique_value1;
house(int hn, int uv0, int uv2)
: house_number(hn),
unique_value0(uv0),
unique_value1(uv1) {}
};
template <typename VALUE> struct node
{
std::string key;
std::vector<VALUE> values;
int left, right;
node<VALUE> *leftNode, *rightNode, *parentNode;
};
如果您想将街道添加到街道node<house> *root;
,您需要做的只是
node<house> *s
当然,更好的选择是使用C ++已有的功能。也就是说,标准库中有一个名为std::multimap的结构,它可以完成你想要做的事情。在这种情况下,您可以简单地声明
s->values.push_back(house(a, b, c));
这可能不会使用AVL平衡。它更可能是一棵红黑树,但这一切都是为你完成的。
答案 1 :(得分:0)
如何分配struct元素?似乎vector<int> dane[3];
已初始化成功,但其内部向量尚未初始化。
尝试将ctor方法添加到struct element
?
struct element
{
char ulica[10];
vector<int> dane[3];
int wolne;
int w;
element *lewy, *prawy, *ojciec;
element()
{
dane[0] = vector<int>();
dane[1] = vector<int>();
dane[2] = vector<int>();
}
};