Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
1

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

29.03.2013, 02:49. Показов 4576. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
структура for_each предельная понятна, но как sort для базовых типов получается только два параметра.
Возможно использовать for_each как-то так?
C++
1
2
3
4
for_each(v.begin(),v.end())
{
     //some do v
}
(именно так невозможно)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2013, 02:49
Ответы с готовыми решениями:

Определить по какой цене был закуплен сахар
Фирма Сахарок реализовала M тонн сахара на сумму рублей, получив при этом N % прибыли Определить...

Построить синтаксический анализатор для понятия идентификатор
Построить синтаксический анализатор для понятия идентификатор. идентификатор. :: = {буква ...

Построить синтаксический анализатор для определяемого в словаре понятия формулировка-задачи
Для описания понятия формулировка-задачи мы снова используем грамматику: формулировка-задачи...

Синтаксический сахар, и каналы
Hello World! 1: Обьясните пожалуйста разницу между конструкциями func foo() <-chan int { return...

18
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
29.03.2013, 03:44 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.
1
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
29.03.2013, 03:45  [ТС] 3
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Ещё более переносимый сахар — std::foreach + лямбды.
это только для с++11 ? ( без сторонних библиотек)
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
29.03.2013, 03:49 4
Анонимные функции естессно. Конечно, функторы будут работать, но они недостаточно сладкие. Если не C++11, то я бы остановился на первом дефайне, если не хочется особо париться. Или использовать шайтан-магию из Qt, если очень хочется "красиво".
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.03.2013, 07:53 5
А про range-for забыли?
C++
1
for( auto& item : container )
2
OhMyGodSoLong
29.03.2013, 11:07
  #6

Не по теме:

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

0
Tulosba
29.03.2013, 11:18
  #7

Не по теме:

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

1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
29.03.2013, 12:09 8
Ребят, что такое сахар? :/
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
29.03.2013, 12:13 9
Цитата Сообщение от nexen Посмотреть сообщение
что такое сахар?
Синтаксический сахар
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.03.2013, 12:24 10
Цитата Сообщение от nexen Посмотреть сообщение
Ребят, что такое сахар?
Сахар
0
go
29.03.2013, 12:38
  #11

Не по теме:

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

0
ForEveR
29.03.2013, 12:45
  #12

Не по теме:

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

0
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
29.03.2013, 15:44  [ТС] 13
Цитата Сообщение от ForEveR Посмотреть сообщение
А мне больше нравится for_each + лямбда, чем цикл по коллекции. Может еще просто не привык.
Какой вы используете компилятор? Поддержка c++11?
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
29.03.2013, 17:28 14
Цикл по колекции будет теоретически быстрее, так как в итоге он разворачивается в обычный for, в то время как для лямбды создается временный объект.
2
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
30.03.2013, 00:24 15
Цитата Сообщение от go Посмотреть сообщение

Не по теме:

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

Не по теме:

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



Цитата Сообщение от Герц Посмотреть сообщение
Цикл по колекции будет теоретически быстрее, так как в итоге он разворачивается в обычный for, в то время как для лямбды создается временный объект.
А практически есть оптимизатор, который умеет инлайнить и лямбды. (Говорю, смотря на выход gcc 4.7.)
1
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
30.03.2013, 18:07  [ТС] 16
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
А практически есть оптимизатор, который умеет инлайнить и лямбды. (Говорю, смотря на выход gcc 4.7.)
Что такое цикл по коллекции и gcc 4.7 вы используете с какой-то оберткой или голый?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 18:58 17
Цитата Сообщение от vbloodv Посмотреть сообщение
Какой вы используете компилятор? Поддержка c++11?
Эта сборка поддерживает С++11: http://sourceforge.net/projects/mingwbuilds/
1
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
30.03.2013, 21:28 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;
}
Цикл по коллекции — это первый вариант. Он семантически эквивалентен последнему, только разыменование итератора выполняется неявно.
2
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.03.2013, 23:37 19
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
В итоге получается, что все эти функции разворачиваются в одно и то же
Что в принципе и следовало ожидать. Первый вариант побеждает в силу большей лаконичности.
1
30.03.2013, 23:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2013, 23:37
Помогаю со студенческими работами здесь

Синтаксический сахар, фичи и полезности C# 6.0 под .Net 4.6
Недавно зарелизилась новая студия 2015, а вместе с ней и язык программирования C# до 6 версии....

Синтаксический сахар. Уточнение второго и последующих типов дженерика
Доброго времени суток, Господа. Объясните мне пожалуйста, почему, когда я пишу вот такой класс:...

С# синтаксический сахар. Убрать ";" и "{}"
Добрый день. Странные у меня претензии, знаю) В общем, поучил немного F# и теперь хочу что бы в...

Синтаксический анализатор для Delphi
Здравствуйте! Помогите написать синтаксический анализатор (нужно сделать поиск по названию...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru