Я не видел ни одного канонического цикла.
Стоимость создания iterator
указана равной O(1)
(по отношению к размеру контейнера), но это может стоить, особенно если активированы определенные параметры отладки.
Следовательно, вызов end
на каждой итерации цикла бесполезен.
Таким образом, канонический способ написать цикл for
состоит в том, чтобы вычислить как it
, так и end
в первом операторе.
typedef std::map<int,int> LayoutType;
for (LayoutType::const_iterator it = layout.begin(), end = layout.end();
it != end; ++it)
{
// ...
}
Я обычно typedef мой контейнер, но, честно говоря, нет смысла в typedefing итераторе, он уже доступен в контейнере, и введение слишком большого количества синонимов не помогает.
Кроме того, это может быть личной причудой, но я предпочитаю указывать функцию , а не type , когда я представляю typedef . Тип может измениться в последующем рефакторинге, функция не изменится (по крайней мере, если это произойдет, это будет совсем не то же самое, поэтому потребуется полная перезапись).
Например, что, если вы вдруг предпочли: typedef std::unordered_map<int,int> LayoutType
? Он по-прежнему соответствует вашим потребностям, и вы, вероятно, можете оставить его без затрат на переписывание (при условии, что вы использовали typedef).