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)
"ikincil düğüm" öğesini bir "vektör" veya bağlantılı bir listede tutmak ister misiniz? Neden "secondaryNode :: next" ye ihtiyacınız var? –
Ü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