C определение типа и вопрос о структуре

Большинство компиляторов должно определить std::hash_map для Вас; в прибытии C++0x стандарт, это будет часть стандартной библиотеки как [1 114] std::unordered_map . Страница STL на нем является довольно стандартной. При использовании Visual Studio , Microsoft имеет страницу на ней.

, Если Вы хотите использовать свой класс в качестве значения, не в качестве ключа, тогда Вы не должны делать ничего специального. Все типы примитивов (вещи как int, char, bool и даже char *) должны "просто работать" ключами hash_map. Однако для чего-либо еще необходимо будет определить собственное хеширование и функции равенства и затем записать "функторы", которые обертывают их в класс.

Принятие Вашего класса называют MyClass, и Вы уже определили:

size_t MyClass::HashValue() const { /* something */ }
bool MyClass::Equals(const MyClass& other) const { /* something */ }

необходимо будет определить два функтора для обертывания тех методов в объекты.

struct MyClassHash {
  size_t operator()(const MyClass& p) const {
    return p.HashValue();
  }
};

struct MyClassEqual {
  bool operator()(const MyClass& c1, const MyClass& c2) const {
    return c1.Equals(c2);
  }
};

И инстанцируют Вашего hash_map / hash_set как:

hash_map my_hash_map;
hash_set my_hash_set;

Все должно работать как ожидалось после этого.

10
задан loneRanger 10 July 2009 в 17:37
поделиться

4 ответа

Что касается предпочтительного стиля, я предпочитаю 1-й стиль (с именем как в теге структуры, так и в качестве typedef для структуры) просто потому, что здесь нет недостатков, кроме нескольких больше символов в исходном файле. Фрагмент структуры моей среды IDE удаляет имя в обоих местах, поэтому я всегда получаю имя структуры с определением типа вместе с именем тега структуры.

Вы получаете несколько небольших преимуществ:

  • " struct STRUCTNAME "можно использовать для объявления указателей на структуру в структуре
  • , вы можете обойтись простым использованием STRUCTNAME в коде C или C ++
  • , вы предотвратите потенциальную (даже если на практике очень редко) странность в C ++, имеющую сделать с именем структуры, используемым для другого объекта без ошибок или предупреждений

Но, если я случайно ввожу определение структуры вручную, я '

8
ответ дан 3 December 2019 в 14:34
поделиться

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

16
ответ дан 3 December 2019 в 14:34
поделиться

Первый пример позволяет вам использовать объект внутри себя для вещей, лежащих в связанных списках и деревьях (как Виктор указывает ). Второй - пример анонимных типов, которые, как показал опыт, не работают хорошо со всеми компиляторами. Так что, вероятно, рекомендуется первый подход. Если вас не волнует, что структура может ссылаться на себя, вы всегда можете дать ей имя, которое вряд ли будет конфликтовать, например, __SOMEPREFIX_IOPORT__.

0
ответ дан 3 December 2019 в 14:34
поделиться

C имеет четыре разных пространства имен, одно из которых - пространство имен тегов структуры. Следовательно:

struct foo { int bar; };

не определяет новый тип в общем смысле. Когда у вас есть только структурный тег, вам нужно добавить ключевое слово 'struct' в объявления объекта следующим образом:

foo b; /* error */
struct foo b; /* correct */

Кроме того, вы можете сразу же создать экземпляр нового объекта в определении, например:

struct foo { int bar; } baz;

Где baz - это объект структурного типа foo. Однако часто возникает необходимость определить структуру как новый тип, чтобы сэкономить время на записи. Полный тип не ссылается на теги структуры, поэтому вы можете опустить префикс 'struct' во время объявления.

typedef struct foo { int bar; } baz;

По-прежнему позволяет вам объявлять объекты с 'struct foo', поскольку foo является тегом структуры. Но теперь он повышен до полного типа в пространстве имен «нормального» типа, где он известен как тип baz. Итак, с typedef, поле (поля) 'baz' имеют другую семантику.

Если вам не нужно объявлять указатели на тип структуры внутри себя (связанные списки, древовидные структуры), опустите его. Добавление ненужного просто загрязняет пространство имен.

9
ответ дан 3 December 2019 в 14:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: