CPtrList - Как получить индекс элемента? - PullRequest
1 голос
/ 27 мая 2020

Как получить индекс элемента в CPtrList?

class CAge
{

public:

CAge(int nAge){m_nAge=nAge;}

int m_nAge;

};



typedef CTypedPtrList <CPtrList, CAge*> CAgePtrList;

CAgePtrList list;

POSITION pos;

CAge *p1 = new CAge(21);

CAge *p2 = new CAge(40);

list.AddTail(p1);
list.AddTail(p2); 

POSITION pos1 = list.GetHeadPosition();
POSITION pos2 = list.Find(p2,NULL);
int nIndex=pos2-pos1;

Если я вычту pos2 из pos1, я получу значение 12. Я ожидаю значение 1, поскольку это 2-й элемент.

Как получить индекс элемента?

1 Ответ

5 голосов
/ 27 мая 2020

CTypedPtrList реализован как связанный список. Указатели POSITION не указывают на непрерывный массив, поэтому арифметика указателя c не будет и не может работать (это также запрещено правилами C ++).

Единственный способ получить индекс POSITION фактически выполняет итерацию в обратном направлении до начала списка и подсчитывает шаги.

int nIndex = -1;

for(POSITION pos = pos2; pos; list.GetPrev(pos))
    nIndex++;

// nIndex is the 0-based index of POSITION 'pos2' in 'list'
//           or -1 if pos2 == NULL
...