Je travaille sur un code existant qui définit une liste chaînée (ne pas utiliser conteneur STL)C++ lié liste code existant à STL - allocation liée taille de la liste à la volée
Je veux convertir ce code afin utiliser la liste STL. Comme vous pouvez le voir dans l'exemple suivant, la liste liée est affectée d'une valeur initiale pour tous les N. Ensuite, certains éléments de la liste ont une certaine valeur. Ensuite, les "éléments vides" de la liste sont "nettoyés".
Je cherche une meilleure façon de le faire en utilisant STL. surtout, peut-on éviter cette suppression du code des éléments vides? J'ai vérifié la documentation de STL .. elle définit une méthode remove
mais ce n'est pas exactement ce dont j'ai besoin ici. Existe-t-il un moyen d'allouer dynamiquement la taille de la liste liée? J'apprécierais vos suggestions!
Mise à jour J'ai modifié le code. Cela ressemble au code principal que j'ai. Mais pour éviter toute confusion, j'écris un pseudo code ci-dessous pour expliquer comment cela fonctionne.
étapes
- Allouer une taille
elementIds
à la liste chaînée (struct my_list
) - Il y a une autre liste chaînée
meshElem
et je suis intéressé par certaines valeurs demeshElem->elem
struct.- Par exemple: J'ai besoin
elemId = meshElem->elem->id;
CeelemId
est à portée0 to elementIds
. - Le
elemId
sera utilisé comme index pour rechercher un élément particulier dansstruct my_list lst
.lst[elemId]
- Par exemple: J'ai besoin
- Dans la fonction
doSomething()
, boucle à travers0 to elementIds
. Dans cette boucle, si certaines conditions sont remplies, lelst->number
est attribué une valeur entière =someArray[i]
où i est dans la gamme0 to N
(fait enappendElement
) - les éléments sans
next
l'entrée dans lestruct my_list lst
, sont nettoyés (Question: cela peut être évité?) - La valeur lst-> number est utilisée plus loin dans le code pour un autre traitement.
Maintenant, le code modifié:
struct my_list
{
int number;
struct my_list *prev;
struct my_list *next;
}
void doSomething(void){
const int N = 50000;
const int elementIds = 10000;
int i, elemId, node_i;
struct my_list *lst;
lst = new struct my_list[elementIds];
int someArray[12];
meshElem = mesh->next;
for(i=0; i<=elementIds; i++) {
lst[i].num = 0;
lst[i].next = NIL;
lst[i].prev = NIL;
}
while(meshElem != NIL){
// Element id (int)
// Note that any elemId will be in range [0 - elemId ]
elemId = meshElem->elem->id;
// Do some operations to populate "lst"
// Note that 'lst' gets values ONLY for certain
// values of i
for (i = 0; i<=N; i++){
// if certain conditions are satisfied,
// it updates the linked list element
// lst[meshIdx]. foo1(), foo2() are just some conditions...
if (foo1()){
appendElement(someArray[i], &lst[meshIdx])
}
else if (foo2()){
appendElement(someArray[i], &lst[meshIdx])
}
}
meshElem = meshelem->next;
} // End of while(meshElem != NIL)
// Clean up the linked list lst
// by removing unassigned items.
struct my_list *lst_2
for(i=1; i<=N; i++) {
lst_2 = &lst[i];
while(lst != NIL) {
if(lst->next != NIL && lst->next->number == 0) {
delete lst_2->next;
lst_2->next = NIL;
} // end of if loop
lst = lst_2->next;
} // end of while while(lst != NIL)
} // End of for(i=1; i<=N; i++)
// Do some more stuff that uses struct my_list lst
for(i=1;i<=elementIds;i++) {
while(lst[i] != NIL && (node_i = lst[i]->number)) {
if(node_i == 0) {
lst[i] = lst[i]->next;
continue;
}
// Use this "node_i" index in some other arrays to
// do more stuff.
//..
//..
//..
lst[i] = lst[i]->next;
}
}
void appendElement(int n, struct my_list *lst) {
int exists = 0;
while(lst->next != NIL) {
if(lst->number == n) {
exists = 1;
lst=lst->next;
}
if(exists < 1) {
lst->number = n2;
insertElemAfter(lst, 0);
}
}
J'espère juste que ce n'est pas le code existant, mais quelque chose que vous avez fait pour la question. –
À quoi ressemble la fonction 'appendElement'? –
considérez'if (i == foo (N)) 'où foo() est défini comme retournant soit 0 ou 1 ... – Will