vector在struct中不起作用

时间:2011-12-30 15:02:18

标签: c++ vector struct add

我有这样的结构:

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不会在最后添加新值,只需替换它。

2 个答案:

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