2016-03-25 14 views
0

Bir vektör (birincil) oluşturmam gerekiyor, her düğüm başka bir vektör üyesine (ikincil) sahip. Hem birincil hem ikincil vektörler dinamik olarak boyutlandırılmalıdır. Bir süredir bununla oynuyordum ve birkaç tane "neredeyse orada" çözümlerle geldim, ama bunların hiçbirini işe yaramıyor.Tam dinamik iç içe geçmiş bir vektör nasıl oluşturabilirim?

primary.push_back(primary_node) gibi bir şey yaparak herhangi bir anda (yalnızca oluşturma zamanında değil) birincil vektöre ekleyebilmem gerekir. Ayrıca, bu düğümlerden herhangi birini herhangi bir zamanda (yalnızca oluşturma zamanında değil) bir yineleyici ile hedefleyebilmeli ve işaret ettiği vektöre ekleyebilmem gerekir. Örnek: primary.begin()->node_head.push_back(secondary_node). İşte anlattığım şeyin bir görselleştirmesi: http://i.imgur.com/g2BCbl9.png

Yine, herhangi bir noktada, birincil (siyah) vektör veya ikincil (kırmızı) vektörlerden herhangi birine ekleyebilmem gerekir. Siyah düğümler üzerinden kırmızı vektörleri seçebilmem gerekiyor.

İlgili kod:

struct secondaryNode 
{ 
    char *name; 
    secondaryNode *next; 
}; 

struct primaryNode 
{ 
    char* typeName; 
    std::vector<secondaryNode> *node_head; //pointer to secondary vector 
}; 

//global primary vector 
std::vector<primaryNode> primary_list; 

void main() { 
    struct primaryNode* primary_temp; 
    primary_temp = ALLOC(struct primaryNode); 
    primary_temp->typeName = strdup("primary temp"); 

    //initialize secondary vector 
    std::vector<secondaryNode> *secondary_list = new std::vector<secondaryNode>; 
    primary_temp->node_head = secondary_list; 

    //first secondary node 
    struct secondaryNode* foo; 
    foo = ALLOC(struct secondaryNode); 
    foo->name = strdup("\nfoo"); 
    secondary_list->push_back(*foo); 

    primary_list.push_back(*primary_temp); //push primary node after giving it a secondary node 

    printf("\n%d", secondary_list->size()); //outputs 1 
    printf("%s", secondary_list->begin()->name); //outputs "foo" 
    printf("%s", primary_list.begin()->node_head->begin()->name); //outputs "foo" 

    //second secondary node 
    struct secondaryNode* bar; 
    bar = ALLOC(struct secondaryNode); 
    bar->name = strdup("\nbar"); 
    secondary_list->push_back(*bar); 

    printf("\n%d", secondary_list->size()); //outputs 2 
    printf("\n%s", secondary_list->end()->name); //outputs NULL 
    printf("\n%s", primary_list.begin()->node_head->end()->name); //outputs NULL 
} 

Bu kodun çıktısı:

1 
foo 
foo 
2 
(null) 
(null) 
+0

"ikincil düğüm" öğesini bir "vektör" veya bağlantılı bir listede tutmak ister misiniz? Neden "secondaryNode :: next" ye ihtiyacınız var? –

+0

Üzgünüz, oraya ihtiyacım yok. Bu farklı bir denemeden oldu ve o bit'i çıkarmayı unuttum. Bu kod biraz aslında kaçınmaya çalışıyorum (iç içe geçmiş listelere sahip) – chemoroti

cevap

0

senin karışıklık çoğu her yerde işaretçileri kullanarak gelir. C++ 'da bunları sıklıkla kullanmak zorunda değilsiniz. Bu kod herhangi işaretçiler olmadan yeniden yazılabilir edilebilir:

secondary_list->end()->name 

end() vektörü sonunun sonraki öğeye Yineleyicinin ve böylece durumda tanımlanmamış dereferencing:

struct secondaryNode 
{ 
    std::string name; 
}; 

struct primaryNode 
{ 
    std::string typeName; 
    std::vector<secondaryNode> secondaryNodes; 
}; 

//global primary vector 
std::vector<primaryNode> primary_list; 

int main() { 
    primaryNode primary_temp; 
    primary_temp.secondaryNodes.push_back(secondaryNode{"\nfoo"}); 

    primary_list.push_back(primary_temp); //push primary node after giving it a secondary node 

    std::cout << primary_list[0].secondaryNodes.size() << std::endl; //outputs 1 
    std::cout << primary_list[0].secondaryNodes[0].name << std::endl; //outputs "foo" 

    //second secondary node 
    primary_list[0].secondaryNodes.push_back(secondaryNode{"\nbar"}); 

    std::cout << primary_list[0].secondaryNodes.size() << std::endl; //outputs 2 
    std::cout << primary_list[0].secondaryNodes[0].name << std::endl; //outputs "foo" 
    std::cout << primary_list[0].secondaryNodes[1].name << std::endl; //outputs "bar" 
} 

kodunuzda Başka bir hata şudur davranış, bu yüzden orada NULL'lar görürsünüz.

+0

Bunu denedim ve işe yarıyor. Teşekkür ederim! Bunun için sonsuza kadar harcadım. – chemoroti

İlgili konular