вектор не работает в структуре - PullRequest
3 голосов
/ 30 декабря 2011

У меня есть такая структура:

struct element{
char ulica[10];
vector<int> dane[3];
int wolne;
int w;
element *lewy, *prawy, *ojciec;
};

И я реализую вид дерева AVL. Когда ключи одинаковы, мне нужно поместить некоторые значения int в dane (dane [0], dane [1], dane [2] описывают 3 разных значения), поэтому я использую

tmp2->dane[0].push_back(number)

EDIT. Вот код, где я добавляю значения к этому вектору, это половина функции, потому что половина secod - это вращение в 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 - указатель на эту структуру (я проверял адрес, на который он указывает, и каждый раз, когда он один и тот же адрес).

Где проблема? Если я добавлю новое значение к вектору, то пока цикл не завершится. Наконец вместо того, чтобы иметь Fe. 4 значения в векторе у меня есть одно, последнее добавленное значение. Вектор не добавляет новое значение в конец, просто заменяет его.

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Вы объявляете начальный размер 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);. Это добавит значение в number к задняя часть вектора 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 - это новое число, добавляемое к i th vector, то же самое соглашение, которое вы, кажется, используете в своем фрагменте кода выше.

Обновление 2 : Основываясь на дополнительной информации, представленной ниже, я думаю, что необходима перестройка вашей структуры данных. Вы смешиваете значение различных компонентов и, более четко разграничив функции элемента данных и управления структурой данных AVL, вы сможете более четко различать эти два компонента. Так что попробуйте это вместо. Иметь структуру данных специально для части «value» ваших узлов дерева, например:

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. Скорее всего, это будет красно-черное дерево, но все это сделано для вас.

0 голосов
/ 08 февраля 2017

Как вы распределяете элемент структуры ?, похоже, что 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>();
    }
};
...