unordered_set from std - PullRequest
       14

unordered_set from std

0 голосов
/ 09 февраля 2012

Я должен переписать Windows-код в кроссплатформенный вид.Вот пример:

std::unordered_set<Type>::iterator it = ...;
it._Ptr->_Myval->...

В каждом коде есть элемент _Ptr в итераторе, но я не могу найти его в документации.Я думаю, что это работает с Visual Studio (это реализация STL).Есть идеи как его заменить?А что такое _Myval?


UPD:

for(std::unordered_set<QuadTreeOccupant*>::iterator it = ...)
   it->aabb;

class QuadTreeOccupant
{
   public:
      AABB aabb;
};

И ошибка в строке it->aabb:

ошибка: запрос на член'aabb' в '* it.std :: __ detail :: _ Hashtable_iterator <_Value, __constant_iterators, __cache> :: operator-> с _Value = qdt :: QuadTreeOccupant *, bool __constant_iterators = true, bool _ cache = false,std :: _detail :: _ Hashtable_iterator <_Value, __constant_iterators, __cache> :: pointer = qdt :: QuadTreeOccupant * const * ', который имеет неклассовый тип' qdt :: QuadTreeOccupant * const '

Ответы [ 3 ]

4 голосов
/ 09 февраля 2012

Это детали реализации unordered_map, специфичные для реализации VC.Вы должны просто удалить ссылку на _Ptr и _Myval и использовать одно из:

  • it->
  • (*it).

место it._Ptr->_Myval.

1 голос
/ 09 февраля 2012

Что касается обновления: итератор "похож на указатель" на элемент, поэтому *it относится к содержащемуся элементу; но , вы не можете получить доступ к элементам ваших элементов, используя it->, так как ваш элемент member является указателем, и, следовательно, итератор "похож" на двойной указатель.

Короче говоря, вы должны сделать:

(*it)->aabb;

, поскольку *it дает вам QuadTreeOccupant*, и вы можете получить доступ к его членам через оператор ->.

--- редактировать ---

слишком поздно ...

0 голосов
/ 09 февраля 2012

_Ptr выглядит как деталь реализации, к которой у вас не должно быть доступа (т.е. он, вероятно, должен быть `private), и вы не должны использовать ни в коем случае: имена, начинающиеся с подчеркивания и сопровождаемые заглавной буквойЭто запретная зона для всех, кроме людей, явно приглашенных. Это всего лишь разработчики системы C ++ (например, составители компиляторов и стандартных библиотек).

Вы просто хотите использовать

it->...
(*it). ...

... для доступа к элементам итератора.

...