Инициализация Итератора внутри для цикла, который рассматривают, плохо разрабатывают, и почему?

Вы можете использовать nameGap с отрицательным значением для правого поля и свойство nameTextStyle.padding для верхнего поля.

xAxis: {
    type: 'category',
    data: hours,
    splitArea: {
        show: true
    },
    name: 'x-axis',
    nameGap: -30,
    nameTextStyle: {
        padding: [50,0,0,0]
    }
}
12
задан steffenj 9 October 2008 в 20:23
поделиться

13 ответов

При обертывании кода в строки правильно встроенная форма была бы одинаково удобочитаема. Кроме того, необходимо всегда делать iterEnd = container.end() как оптимизация:

for (SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin(),
    IterEnd = m_SomeMemberContainerVar.end();
    Iter != IterEnd;
    ++Iter)
{
}

Обновление: зафиксированный код на совет paercebal.

14
ответ дан 2 December 2019 в 03:43
поделиться

Я нахожу вторую опцию более читаемой, поскольку Вы не заканчиваете с одной гигантской строкой. Однако Ferruccio поднимает положительную сторону у объема.

0
ответ дан 2 December 2019 в 03:43
поделиться

Я обычно писал бы:

SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin(),
                                   IterEnd = m_SomeMemberContainerVar.end();

for(...)
0
ответ дан 2 December 2019 в 03:43
поделиться

Можно бросить фигурные скобки вокруг инициализации и цикла, если Вы обеспокоены объемом. Часто то, что я сделаю, объявляют итераторы в начале функции и снова используют их всюду по программе.

0
ответ дан 2 December 2019 в 03:43
поделиться

Я соглашаюсь с Ferruccio. Первый стиль мог бы быть предпочтен некоторыми для получения по запросу конца () вызов из цикла.

Я мог бы также добавить, что C++ 0x на самом деле сделает обе версии намного более чистыми:

for (auto iter = container.begin(); iter != container.end(); ++iter)
{
   ...
}

auto iter = container.begin();
auto endIter = container.end();
for (; iter != endIter; ++iter)
{
   ...
}
0
ответ дан 2 December 2019 в 03:43
поделиться

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

doStuff(coll.begin(), coll.end())

и имейте..

template<typename InIt>
void doStuff(InIt first, InIt last)
{
   for (InIt curr = first; curr!= last; ++curr)
   {
       // Do stuff
   }
 }

Вещи любить:

  • Никогда не должны упоминать ужасный тип итератора (или думать о том, является ли это константой или не-константой),
  • Если существует усиление от не вызова конца () на каждом повторении, я получаю его

Вещи не любить:

  • Разбивает код
  • Наверху дополнительного вызова функции.

Но однажды, у нас будут лямбды!

1
ответ дан 2 December 2019 в 03:43
поделиться

Нет, это - плохая идея овладеть на iter.end() прежде чем цикл запускается. Если Ваш цикл изменяет контейнер затем, конечный итератор может делаться недействительным. Кроме того, end() метод, как гарантируют, будет O (1).

Преждевременная оптимизация является корнем всего зла.

Кроме того, компилятор может быть более умным, чем Вы думаете.

4
ответ дан 2 December 2019 в 03:43
поделиться

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

Однако удобочитаемость может быть проблемой; этому можно помочь при помощи определения типа, таким образом, тип итератора немного более управляем:

typedef SomeClass::SomeContainer::iterator sc_iter_t;

for (sc_iter_t Iter = m_SomeMemberContainerVar.begin(); Iter != m_SomeMemberContainerVar.end(); ++Iter)
{
}

Не огромное улучшение, но немного.

1
ответ дан 2 December 2019 в 03:43
поделиться

Посмотрев на это в g ++ при-O2 оптимизации (только, чтобы быть конкретным)

Нет никакого различия в сгенерированном коде для станд.:: вектор, станд.:: список и станд.:: карта (и друзья). Существуют крошечные издержки со станд.:: двухсторонняя очередь.

Так в целом с точки зрения производительности это имеет мало значения.

4
ответ дан 2 December 2019 в 03:43
поделиться

Первая форма (в для цикла) лучше, если итератор не нужен после для цикла. Это ограничивает свой объем для цикла.

Я серьезно сомневаюсь, что существует любое увеличение эффективности так или иначе. Это может также быть сделано более читаемым с определением типа.

typedef SomeClass::SomeContainer::iterator MyIter;

for (MyIter Iter = m_SomeMemberContainerVar.begin(); Iter != m_SomeMemberContainerVar.end(); ++Iter)
{
}

Я рекомендовал бы более короткие имена ;-)

5
ответ дан 2 December 2019 в 03:43
поделиться

Я не думаю, что это - плохой стиль вообще. Просто используйте определения типов для предотвращения многословия STL и длинных линий.

typedef set<Apple> AppleSet;
typedef AppleSet::iterator  AppleIter;
AppleSet  apples;

for (AppleIter it = apples.begin (); it != apples.end (); ++it)
{
   ...
}

Спартанское Программирование является одним способом смягчить Ваши проблемы стиля.

1
ответ дан 2 December 2019 в 03:43
поделиться

Другая альтернатива должна использовать foreach макрос, например, повысить foreach:

BOOST_FOREACH( ContainedType item, m_SomeMemberContainerVar )
{
   mangle( item );
}

Я знаю, что макросам препятствуют в современном C++, но пока автоматическое ключевое слово не широко доступно, это - лучший способ, которым я нашел для получения чего-то, что кратко и читаемо, и все еще абсолютно безопасно с точки зрения типов и быстро. Можно реализовать использование макроса, какой бы ни стиль инициализации получает Вас лучшая производительность.

Существует также примечание на связанной странице о переопределении BOOST_FOREACH как foreach для предотвращения раздражающих всех заглавных букв.

9
ответ дан 2 December 2019 в 03:43
поделиться

У меня нет консольного опыта, но в самом современном C++ compiliers любая опция заканчивает тем, что был equivilent за исключением вопроса объема. Visual Studio compilier будет фактически всегда даже в коде отладки помещать сравнение условия в неявную временную переменную (обычно регистр). Таким образом, в то время как логически это похоже на конец (), вызов выполняется посредством каждого повторения, оптимизированный скомпилированный код на самом деле только выполняет вызов однажды, и сравнение является единственной вещью, которая сделана в каждый subsiquent раз через цикл.

Это не может иметь место на консолях, но Вы могли не собрать цикл для проверки, чтобы видеть, происходит ли оптимизация. Если это, то Вы можете Вы безотносительно стиля, который Вы предпочитаете, или является стандартным в Вашей организации.

1
ответ дан 2 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

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