矢量在结构中不起作用
vector doesn't work in struct
我有一个这样的结构体:
struct element{
char ulica[10];
vector<int> dane[3];
int wolne;
int w;
element *lewy, *prawy, *ojciec;
};
我在实现AVL树。当键相同时,我需要给dane添加一些int值(dane[0], dane[1], dane[2]描述3个不同的值),所以我使用
tmp2->dane[0].push_back(number)
编辑。这是我给这个向量添加值的代码,它是函数的一半,因为另一半是关于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不添加新值到末尾,只是替换它。
在std::vector的构造函数中声明了它的初始大小,因此实现这一点的一种方法是:
struct element
{
char ulica[10];
std::vector<int> dane;
int wolne;
int w;
element *lewy, *prawy, *ojciec;
element() : dane(3) {}
};
如果不包含构造函数,则vector的初始大小为0。在任何情况下,要添加一个元素到后面,只需使用tmp2->dane.push_back(number);
。这将把number
中的值添加到向量tmp2->dane
的后面,这可能会导致为向量实例分配的内存量的变化。
UPDATE:根据OP的评论,他需要三个向量,试试这个:
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
是要添加到i
向量的新数字,这与您在上面的代码段中使用的约定相同。
更新2:根据下面的附加信息,我认为需要重新设计您的数据结构。您正在混合各种组件的含义,并且通过更清楚地描述数据元素和AVL数据结构管理的功能,您将能够更清楚地区分两者。所以试试这个吧。为树节点的"值"部分提供一个专门的数据结构,如:
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
,你所需要做的就是
s->values.push_back(house(a, b, c));
当然,更好的选择是使用c++已有的功能。也就是说,在标准库中有一个叫做std::multimap的结构它能做你想做的很多事情。在这种情况下,您可以简单地声明
std::multimap<std::string, house> myMap;
这可能不会使用AVL平衡。它更有可能是一棵红黑树,但这一切都是为你做的。
如何分配struct元素?,似乎vector<int> dane[3];
已经初始化成功,但其内部向量没有初始化。
尝试在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>();
}
};
- 编译器上的策略数据结构不起作用
- C++结构模板变量快捷方式定义不起作用
- 内部结构初始化不起作用 - C++
- 没有类型结构绑定不起作用?
- 使用选择排序对数组数据结构进行排序,但它不起作用
- 结构/方法不起作用
- 如果在结构内部使用condition_variable,则它不起作用
- C++覆盖父结构中的数据不起作用
- 将参考类型作为嵌套模板结构中的模板参数作为模板参数不起作用
- 指向结构的指针不起作用
- 结构程序不起作用
- GCC:当层次结构中存在虚拟继承时,C++11 内联对象初始化(使用 "this")不起作用
- C++ -- 指向结构数组的指针,该数组包含指向不起作用的类数组的指针
- 如果所述结构具有构造函数,则带有 new[] 的结构数组似乎不起作用
- 在文档中引用使用doxygen的结构成员不起作用;结构成员未出现在文档中
- 为什么我的结构中映射的构造函数不起作用
- 我的火狐扩展程序不起作用。使用C++XPCOM组件的Firefox扩展(XPI文件)的结构是什么?
- c++ 将文本文件读取到结构数组中不起作用
- 从存储在 CTreeCtrl 的 LPARAM 中的结构中检索地址/指针 (IXMLDOMNode*) - 不起作用
- 自定义结构排序不起作用