2013-10-06 1 views
2
 list<CPoint> l; 

     l.push_back(CPoint(1,2)); 
     l.push_back(CPoint(30,40)); 
     l.push_back(CPoint(4,6)); 
     l.push_back(CPoint(70,80)); 

     CPoint * point = 0; 

     for (list<CPoint>::iterator iter = l.begin(); 
       iter != l.end(); 
       iter++) 
     { 
      cout << iter->x << " , " << iter->y << endl; 

      // compilation error, I can't typcast it like below? 
      point = (CPoint *) iter; 
     } 

Проблемы с выше, является то, как typcast в iter в петле фактического указателя структуры данных? Таким образом, я могу написать код, например, point.x, point.y.Как typcast итератор к своей первоначальной структуре

Вышеупомянутый демо-код, который я написал, но на самом деле у меня есть этот код в функции поиска. Если элемент найден в списке, он вернет указатель на этот элемент, иначе NULL. Чтобы вернуть этот указатель, мне нужно разыменовать итератор обратно на указатель базовой структуры данных, но как? Благодарю.

ответ

3

Чтобы исправить ошибку синтаксиса, вам необходимо разыменование итератора затем взять адрес из под объект:

point = &*iter; 

Вы бы лучше просто использовать std::find/std::find_if и хранить итератор, который возвращается из станда :: списка ,

auto it = std::find_if(l.begin(), l.end(), 
         [](const CPoint& cp) { return cp.x == 1 && cp.y == 2; }); 

if (it != l.end()) // test iterator to see is desired CPoint is found 
{ 
    std::cout << (*it).x << " " << (*it).y << std::endl; 
} 
Смежные вопросы