矢量在结构中不起作用

vector doesn't work in struct

本文关键字:不起作用 结构      更新时间:2023-10-16

我有一个这样的结构体:

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