2012-04-18 4 views
0

Следующий вопрос Segmentation fault executing method Я остановился в другой проблеме.Получить итератор от pointer

Дано:

Cluster * base; 
Cluster * absorbed; 

list<Cluster>::iterator li = clusters.begin(); 

// li is then pointed to some element. 

absorbed = &(*li); // Get a pointer to the chosen element. 

base->joinCluster(absorbed); // Perform an action with absorbed. 

// li contines the cycle and now point to clusters.end() 

// Now, absorbed should be deleted from list. li doesn't point to absorbed anymore. 
li = & (* absorbed); 
clusters.erase(li); 

Пытался сделать реверс выше, но г ++ возвращает ошибку: error: no match for 'operator=' in 'li = absorbed' Как я могу это сделать?

Я стараюсь избегать циклического перехода по всем элементам в списке, чтобы снова найти absorbed.

Edit:

Извините, но я понимаю, что я пропустил, чтобы сказать, что после absorbed = &(* li);li продолжает цикл до clusters.end(). Итак, в момент окончания цикла li больше не указывает на absorbed. Я думаю, у меня есть два варианта: либо я снова повторяю все элементы в clusters, чтобы найти элемент absorbed; Или я использую указатель absorbed для стирания элемента с clusters. Но как я могу достичь этого второго варианта?

ответ

4

Просто пропустите линию li = &(*absorbed), и она должна работать нормально.

3

Вы не можете получить std::list<T>::iterator от T*. Вам нужно будет использовать оригинал li для выполнения операций итератора.

3

Просто удалите его!
Не нужно пытаться вернуть значение, если вы все равно его удаляете.

0

вместо

// Now, absorbed should be deleted from list 
li = & (* absorbed); 
clusters.erase(li); 

использования:

clusters.pop_front(); 

если вы всегда обрабатывать первый элемент.

Невозможно получить итератор от значения. Не причина, но одно и то же значение, может быть в нескольких контейнерах или более одного раза в одном.

Смежные вопросы