Find index CStringList

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
mesajflaviu
Membru++
Membru++
Posts: 686
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Find index CStringList

Post by mesajflaviu » 28 May 2014, 09:18

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 ?



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Find index CStringList

Post by Ovidiu Cucu » 28 May 2014, 19:57

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.

mesajflaviu
Membru++
Membru++
Posts: 686
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Find index CStringList

Post by mesajflaviu » 29 May 2014, 09:24

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.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Find index CStringList

Post by Ovidiu Cucu » 29 May 2014, 09:58

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:

mesajflaviu
Membru++
Membru++
Posts: 686
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Find index CStringList

Post by mesajflaviu » 29 May 2014, 10:04

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 ...

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Find index CStringList

Post by Ovidiu Cucu » 29 May 2014, 10:16

...sau, ca sa stii ce sa alegi dintre containerele MFC, poti arunca un ochi si aici:

mesajflaviu
Membru++
Membru++
Posts: 686
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Find index CStringList

Post by mesajflaviu » 29 May 2014, 10:58

Multumesc mult pentru tot suportul.

swera
Junior
Junior
Posts: 1
Joined: 29 Oct 2014, 07:10
Judet: Bihor

Re: Find index CStringList

Post by swera » 29 Oct 2014, 07:33

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 ...
Our complete set of 642-437 latest braindumps test questions and JUNIPER study guides you in exact University of California, Berkeley you will pass your real wikipedia exam & 642-647 with flying colors

Post Reply