powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Достать итератор изнутри лямбды
16 сообщений из 16, страница 1 из 1
Достать итератор изнутри лямбды
    #38405045
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!

Можно ли изнутри лямбды достучаться до итератора?

Типа
Код: plaintext
1.
generate(begin(container), end(container), [](){if(last element) do_stuff1; else do_stuff2;});



Разумеется, можно сделать без лямбд, но подсел на компактность
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405053
Только грязным хаком:
Код: plaintext
1.
generate(begin(container), end(container), [](T &val){ if(&val == &*container.rbegin()) do_stuff1; else do_stuff2; });
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405090
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Жалко.
Впрочем, вроде вариант более менее рабочий.
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405117
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolyanchikРазумеется, можно сделать без лямбд, но подсел на компактность
В настоящей погоне за компактностью люди наворотили 5К Chess умело используя #defines.
А некоторые перцы пилят ультра-компактные эзотерические ЯП (кстати в смежных форумах ).
Но я-бы выбирал между идеологией и С++. Если вы твёрдо решили идти в лямбды то может
быть стоит менять парадигму а не курочить бедные несчастные плюсы. Их семантика и так
пострадала да лет 10-20 навязывания чужеродных стилей кодинга. Старик Бьярне хватается
за сердце и пьёт капли.

Да и тимлид вас проклянёт проклятием Вуду после первого кодеревью
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405122
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да ну:)

Сам Бьярн очень доволен новым С++, мол это как новый язык.

Компактность не самоцель, просто если нет разницы, зачем писать больше?
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405141
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolyanchikДа ну:)

Сам Бьярн очень доволен новым С++, мол это как новый язык.

Компактность не самоцель, просто если нет разницы, зачем писать больше?А как насчет "читать"?

Речь то не о том что ты такой молодец запихнул в минимум букв, максимум команд. А о том, что кто-то это потом поддерживать будет и искать в этом баги. И твой напарник привыкший к С++ проклянет тебя, выкинет твой код нафиг и перепишет его в традиционном стиле.
А если так хочется писать функционально - ну возьми Хаскел и пиши на нем. Связь с С++ там очень легко делается и всем будет сразу понятно что этот код написан в лямбда-стиле.
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405145
А чем не нравиться по людски?
Код: plaintext
1.
2.
generate(begin(container), end(container) - 1, [](T &val){ do_stuff1; });
do_stuff2 with *container.rbegin()
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405149
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Читаемость не страдает, думаю, это дело привычки.

В основном лямбды будут работать внутри стандартных алгоритмов.

А что взамен? Функторы?

Или велосипедный самопал вместо алгоритмов СТЛ ( зато понятно )?
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405150
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только грязным хаком

Можно, конечно. Но хотелось однострочник:)
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405156
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только грязным хаком:А чем не нравиться по людски?
Код: plaintext
1.
2.
generate(begin(container), end(container) - 1, [](T &val){ do_stuff1; });
do_stuff2 with *container.rbegin()


А для любых контейнеров гарантируется корректность вычитания из end() ?
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405157
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только грязным хаком

Плюс это не для всех типов итераторов.
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405160
Легко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tolyanchik Только грязным хаком Можно, конечно. Но хотелось однострочник:)Легко!
Код: plaintext
1.
generate(begin(container), end(container) - 1, [](T &val){ do_stuff1; });  do_stuff2 with *container.rbegin();
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405180
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolyanchik,

Напишите свой generate с двумя генераторами и используйте в своих однострочниках.
Типа такого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
template <class Iter, class Gen, class GenLast>
void generate(Iter first, Iter last, Gen gen, GenLast gen_last )
{
    Iter next;
    while (first != last)
    {
        next = first;
        ++next;
        *first = next != last ? gen() : gen_last();
        first = next;
    }
}

//generate(begin, end, [](){ return 1;}, [](){return 2;} );
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405188
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsk

Спасиб, интересно!
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405239
Anatoly MoskovskyТолько грязным хаком:А чем не нравиться по людски?
Код: plaintext
1.
2.
generate(begin(container), end(container) - 1, [](T &val){ do_stuff1; });
do_stuff2 with *container.rbegin()


А для любых контейнеров гарантируется корректность вычитания из end() ?
Только: vector, array и deque.

В list, map и set только такого вида вариант прокатывает:
Код: plaintext
1.
for_each(begin(container), end(container), [&] (int const& val) { if(&val != &*container.crbegin()) cout << val; } );



В unordered_set, unordered_map и forward_list нету функции .rbegin().

И к слову, в queue и stack вообще нету being() и end() :)

http://ideone.com/j1wMQo
...
Рейтинг: 0 / 0
Достать итератор изнутри лямбды
    #38405708
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot mayton]tolyanchikНо я-бы выбирал между идеологией и С++. Если вы твёрдо решили идти в лямбды то может
быть стоит менять парадигму а не курочить бедные несчастные плюсы. Их семантика и так
пострадала да лет 10-20 навязывания чужеродных стилей кодинга. Старик Бьярне хватается
за сердце и пьёт капли.

Ну, тут ты глубоко неправ.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Достать итератор изнутри лямбды
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]