std :: map с типом typedef в нем? - PullRequest
1 голос
/ 28 октября 2010

Это хорошая идея сделать в C ++ следующее:

typedef std::map<std::string, boost::any> MyVals;

// Is the following typedef'd type inside a map a good idea?
typedef std::map<std::string, MyVals> TagValues;  

Эти карты будут часто использоваться для последовательной вставки и удаления.

Ответы [ 6 ]

7 голосов
/ 28 октября 2010

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

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

Просто сравните

std::map<std::string, std::map<std::string, boost::any>::const_iterator it =
         tagValues.find(x);

с

TagValue::const_iterator it = tagValues.find(x);
3 голосов
/ 28 октября 2010

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

Одна вещь, которая всегда беспокоит меня при использовании вложенных map s, - это обеспечение эффективности создания ключей и значений для копирования или использование хранилища в единственном экземпляре (например, shared_ptr), чтобы избежать этого.Особенно, если вы делаете много вставок / удалений, затраты на ведение домашнего хозяйства могут быть большими.

1 голос
/ 28 октября 2010

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

1 голос
/ 28 октября 2010

Нет проблем.

Определения классов STL могут быстро усложниться, поэтому часто бывает полезно использовать typedef для определения коллекций, итераторов и т. Д.

1 голос
/ 28 октября 2010

Какие плохие вещи ты видишь?Я бы однозначно напечатал бы все, что долго печатать ...

1 голос
/ 28 октября 2010

Это полностью допустимо и, как правило, хорошая идея, если вы хотите позже легко изменить тип MyVals. По моему мнению и из того, что я слышал / видел / читал, это именно то, для чего нужны typedef.

Однако, и это то, на что нужно обратить внимание, вам нужно убедиться, что вы никогда не измените typedef на что-то, что не может быть юридически использовано в std::map. Если вы это сделаете, вы столкнетесь с некоторыми проблемами, и может быть немного трудно отследить, где проблема.

...