Форум программистов, компьютерный форум CyberForum.ru

Синтаксический сахар для for - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
29.03.2013, 02:49     Синтаксический сахар для for #1
структура for_each предельная понятна, но как sort для базовых типов получается только два параметра.
Возможно использовать for_each как-то так?
C++
1
2
3
4
for_each(v.begin(),v.end())
{
     //some do v
}
(именно так невозможно)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2013, 02:49     Синтаксический сахар для for
Посмотрите здесь:

Синтаксический анализ C++
Синтаксический анализ выражений C++
C++ Синтаксический анализатор. Рекурсия
Синтаксический анализатор C++
Синтаксический редактор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
29.03.2013, 03:44     Синтаксический сахар для for #2
Условно переносимый сахар (в С++11 можно переписать с auto и не объявлять переменную заранее):
C++
1
2
3
4
#define foreach (_Container, _Variable)  \
  for (_Variable = (_Container).begin(); \
       _Variable != (_Container).end();  \
       _Variable++)
Более переносимый сахар — std::for_each + лямбды (или функторы для бедных).

Непереносимый, но работающий в C++03 сахар — см. реализацию foreach в Qt.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
29.03.2013, 03:45  [ТС]     Синтаксический сахар для for #3
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Ещё более переносимый сахар — std::foreach + лямбды.
это только для с++11 ? ( без сторонних библиотек)
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
29.03.2013, 03:49     Синтаксический сахар для for #4
Анонимные функции естессно. Конечно, функторы будут работать, но они недостаточно сладкие. Если не C++11, то я бы остановился на первом дефайне, если не хочется особо париться. Или использовать шайтан-магию из Qt, если очень хочется "красиво".
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.03.2013, 07:53     Синтаксический сахар для for #5
А про range-for забыли?
C++
1
for( auto& item : container )
OhMyGodSoLong
29.03.2013, 11:07
  #6

Не по теме:

Про слона-то я и забыл...

Tulosba
29.03.2013, 11:18
  #7

Не по теме:

Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Не по теме:
Про слона-то я и забыл...
Забыть не страшно, страшно - не приметить

nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 12:09     Синтаксический сахар для for #8
Ребят, что такое сахар? :/
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.03.2013, 12:13     Синтаксический сахар для for #9
Цитата Сообщение от nexen Посмотреть сообщение
что такое сахар?
Синтаксический сахар
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.03.2013, 12:24     Синтаксический сахар для for #10
Цитата Сообщение от nexen Посмотреть сообщение
Ребят, что такое сахар?
Сахар
go
29.03.2013, 12:38
  #11

Не по теме:

Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
std::for_each + лямбды
Использовать С++11 и не использовать цикл по коллекции???

ForEveR
29.03.2013, 12:45
  #12

Не по теме:

go, А мне больше нравится for_each + лямбда, чем цикл по коллекции. Может еще просто не привык.

vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
29.03.2013, 15:44  [ТС]     Синтаксический сахар для for #13
Цитата Сообщение от ForEveR Посмотреть сообщение
А мне больше нравится for_each + лямбда, чем цикл по коллекции. Может еще просто не привык.
Какой вы используете компилятор? Поддержка c++11?
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
29.03.2013, 17:28     Синтаксический сахар для for #14
Цикл по колекции будет теоретически быстрее, так как в итоге он разворачивается в обычный for, в то время как для лямбды создается временный объект.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.03.2013, 00:24     Синтаксический сахар для for #15
Цитата Сообщение от go Посмотреть сообщение

Не по теме:

Использовать С++11 и не использовать цикл по коллекции???

Не по теме:

Я и не использую Си++11 И с функциональщиной лучше знаком вне его контекста.



Цитата Сообщение от Герц Посмотреть сообщение
Цикл по колекции будет теоретически быстрее, так как в итоге он разворачивается в обычный for, в то время как для лямбды создается временный объект.
А практически есть оптимизатор, который умеет инлайнить и лямбды. (Говорю, смотря на выход gcc 4.7.)
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
30.03.2013, 18:07  [ТС]     Синтаксический сахар для for #16
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
А практически есть оптимизатор, который умеет инлайнить и лямбды. (Говорю, смотря на выход gcc 4.7.)
Что такое цикл по коллекции и gcc 4.7 вы используете с какой-то оберткой или голый?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 18:58     Синтаксический сахар для for #17
Цитата Сообщение от vbloodv Посмотреть сообщение
Какой вы используете компилятор? Поддержка c++11?
Эта сборка поддерживает С++11: http://sourceforge.net/projects/mingwbuilds/
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.03.2013, 21:28     Синтаксический сахар для for #18
Цитата Сообщение от vbloodv Посмотреть сообщение
Что такое цикл по коллекции и gcc 4.7 вы используете с какой-то оберткой или голый?
Сравнивал вывод gcc с ключом -S (выдаёт ассемблерный код вместо бинарей). В итоге получается, что все эти функции разворачиваются в одно и то же:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
template <class T>
T sum1(const std::vector<T> &Xs)
{
    T res = 0;
    for (auto X : Xs) {
        res += X;
    }
    return res;
}
 
template <class T>
T sum2(const std::vector<T> &Xs)
{
    T res = 0;
    std::for_each(Xs.begin(), Xs.end(), [&](const T &X){
        res += X;
    });
    return res;
}
 
template <class T>
T sum3(const std::vector<T> &Xs)
{
    T res = 0;
    for (auto X = Xs.begin(); X != Xs.end(); X++) {
        res += *X;
    }
    return res;
}
Цикл по коллекции — это первый вариант. Он семантически эквивалентен последнему, только разыменование итератора выполняется неявно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 23:37     Синтаксический сахар для for
Еще ссылки по теме:

Определить по какой цене был закуплен сахар C++
синтаксический анализатор C++
Синтаксический анализатор C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.03.2013, 23:37     Синтаксический сахар для for #19
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
В итоге получается, что все эти функции разворачиваются в одно и то же
Что в принципе и следовало ожидать. Первый вариант побеждает в силу большей лаконичности.
Yandex
Объявления
30.03.2013, 23:37     Синтаксический сахар для for
Ответ Создать тему
Опции темы

Текущее время: 00:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru