Page 1 of 1

Find index CStringList

Posted: 28 May 2014, 09:18
by mesajflaviu
Am un CStringList (constant, adica e parametru intr-o metoda: MyMethod(const CStringList& List) ) care poate avea intre 1 si peste 100 de elemente ... la un moment dat, cat un string in lista, si cand il gasesc am pozitia (POSITION) lui din lista ... dar mi-ar trebui si index-ul lui, cum il pot afla ? M-am gandit la o solutie, dar nu stiu daca e safe:

Code: Select all

int nIndex = -1;
POSITION posStart = List.GetHeadPosition();
POSITION posFound = List.Find(_T("Ali ba ba"));
if(NULL != posFound)
    nIndex = posStart - posFound;
O alta intrebare: la ce e folosita metoda CStringList::FindIndex() ? Cand am putea stii (in practica) index-ul unui element din lista ?

Re: Find index CStringList

Posted: 28 May 2014, 19:57
by Ovidiu Cucu
NU. Nu are sens un index intr-o lista si tocmai asta deosebeste o lista de un array (vector).
In timp ce la array poti accesa direct un element printr-un index, o lista se parcurge secvential.
Acel CStringList::FindIndex, de fapt parcurge lista nod cu nod pana se ajunge la an N-lea.
POSITION este de fapt un pointer care iti da un nod din lista. Cu el, poti obtine elemental curent cu GetAt, urmatorul element cu GetNext sau cel precedent cu GetPrev (intr-o lista dublu-inlantuita, fiecare nod tine un pointer la nodul urmator si unul la nodul precedent).
NU. Nu are sens sa scazi doua noduri dintr-o lista pentru ca nu sunt asezate consecutiv in memorie.

Deci, daca vrei sa accesezi un element al unei colectii printr-un index, foloseste CStringArray (sau alt tip de array).
Daca nu te intereseaza accesul direct, foloseste CStringList (sau altfel de lista) care poate fi mai optima, de exemplu atunci cand se insereaza un element.

Re: Find index CStringList

Posted: 29 May 2014, 09:24
by mesajflaviu
Nu are sens sa scazi doua noduri dintr-o lista pentru ca nu sunt asezate consecutiv in memorie
Ma gandeam eu ca nu se pot scadea variabile POSITION ... Sa vad cum pot rezolva. Multumesc.

Re: Find index CStringList

Posted: 29 May 2014, 09:58
by Ovidiu Cucu
De putut se pot scadea (daca vrei, poti :) ), insa nu da rezultatul pe care-l astepti.

Ca sa-ti faci o idee mai clara despre deosebirille dintre list si array/vector, trage un ochi prin definitiile din paginile urmatoare:

Re: Find index CStringList

Posted: 29 May 2014, 10:04
by mesajflaviu
Daca imi trebuie o colectie la care sa pot gasi rapid un item, dar sa si contina informatii suplimentare (de exemplu ordinea adaugarii in colectie), ma gandesc ca cel mai bine ar fi sa folosesc un CMapStringToString ...

Re: Find index CStringList

Posted: 29 May 2014, 10:16
by Ovidiu Cucu
...sau, ca sa stii ce sa alegi dintre containerele MFC, poti arunca un ochi si aici:

Re: Find index CStringList

Posted: 29 May 2014, 10:58
by mesajflaviu
Multumesc mult pentru tot suportul.

Re: Find index CStringList

Posted: 29 Oct 2014, 07:33
by swera
Chiar daca am un singur document template, intr-o aplicatie MDI, primul document deschis are item-uri in treeviewe-ul cum trebuie (unele cu checkbox-uri, unele fara), cand deschid al doilea document, toate checkbox-urile din treeview au checkbox-uri ... atasez o aplicatie simple de test pentru exemplificare ...