STL как контейнер typedef ярлык? - PullRequest
       7

STL как контейнер typedef ярлык?

1 голос
/ 24 сентября 2008

Общий шаблон с контейнерами STL таков:

map<Key, Value> map;
for(map<Key, Value>::iterator iter = map.begin(); iter != map.end(); ++iter)
{
  ...
}

Таким образом, чтобы избежать написания декларации параметров шаблона, мы можем сделать это где-нибудь:

typedef map<Key, Value> TNiceNameForAMap;

Но если эта карта используется только в одной функции или для одной итерации, это раздражает.

Есть ли способ обойти это определение типа?

Ответы [ 7 ]

10 голосов
/ 24 сентября 2008

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

Если он используется только в ограниченной области, поместите typedef в ту же область. Тогда его не нужно публиковать, документировать или отображать на любых диаграммах UML. Например (и я не утверждаю, что это лучший код из всех когда-либо существовавших):

int totalSize() {
    typedef std::map<Key, Value> DeDuplicator;
    DeDuplicator everything;

    // Run around the universe finding everything. If we encounter a key
    // more than once it's only added once.

    // now compute the total
    int total = 0;
    for(DeDuplicator::iterator i = everything.begin(); i <= everything.end(); ++i) {
        total += i->second.size(); // yeah, yeah, overflow. Whatever.
    }
    return total;
}

В сочетании с предложением Ферруччо (если вы используете повышение) цикл становится:

BOOST_FOREACH(DeDuplicator::pair p, everything) {
    total += p.second.size();
}

И в сочетании с предложением bk1e (если вы используете C ++ 0x или у вас есть возможности от него), и предполагая, что BOOST_FOREACH взаимодействует с auto так, как я думаю, это должно основываться на том факте, что он обычно может обрабатывать неявные преобразования к совместимым типам:

std::map<Key, Value> everything;
// snipped code to run around...
int total = 0;
BOOST_FOREACH(auto p, everything) {
    total += p.second.size();
}

Неплохо.

5 голосов
/ 24 сентября 2008

Вы можете использовать Boost.Foreach

3 голосов
/ 24 сентября 2008

В будущей версии стандарта C ++ (известной как C ++ 0x ) будет введено новое использование для ключевого слова auto , что позволит вам написать что-то вроде следующего :

map<Key, Value> map;
for(auto iter = map.begin(); iter != map.end(); ++iter)
{
  ...
}
2 голосов
/ 24 сентября 2008

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

Как только код скомпилирован, не будет никакой разницы в размере или скорости исполняемого файла. Это просто читабельность.

0 голосов
/ 24 сентября 2008

За последние несколько лет я действительно пытался отойти от использования циклов, написанных вручную, предпочитая использовать алгоритмы STL. Ваш код выше можно изменить на:

struct DoLoopBody {
  template <typename ValueType>
  inline void operator()(ValueType v) const {
    // ...
  }
};

std::for_each (map.begin(), map.end(), DoLoopBody ());

К сожалению, класс DoLoopBody не может быть локальным классом, что часто подчеркивается как недостаток. Тем не менее, я считаю это преимуществом в том, что тело цикла теперь может быть проверено модулем изолированно.

0 голосов
/ 24 сентября 2008

C ++ 0x также будет предлагать циклический цикл for, который похож на итеративный для цикла в других языках.

К сожалению, GCC пока не реализует для диапазона диапазон (но не реализует авто).

Изменить: В то же время, также рассмотреть определение типа итератора. Он не обходится без одноразового использования typedef (если только вы не поместите его в заголовок, который всегда является опцией), но сокращает результирующий код на один :: iterator.

0 голосов
/ 24 сентября 2008

Если typedef является локальным для отдельной функции, ему даже не нужно быть nice name. Используйте X или MAP, как в шаблоне.

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