powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ненавижу итератор...
58 сообщений из 58, показаны все 3 страниц
Ненавижу итератор...
    #39296009
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это будет очередной топик плача по хорошему языку С++, который мог бы быть еще лучше, но стал хуже.

Виноват в этом один человек, по фамилии Степанов. Ну и конечно другой человек Страустрап, который ему потакал в этом...

Скажите, может ли функция в C++ вернуть более одного значения?

Нет, не может.

А скажите, как задается диапазон для обработки контейнера в любой функции STL?

Парой итераторов, так?

Ну и о чем думал этот Степанов, где у него мозги- то были? Как вызовы функций STL каскадировать?

Можно только создавать новые и новые переменные и копировать данные, сейчас есть move semantics, а тогда-то не было...

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

----
Читал хинты оракла. Много думал...
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296108
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не подстрекатель, но вот что предложено вместо итераторов в D

https://dlang.org/phobos/std_range.html

Возможно этот концепт еще где то есть. Упд - в Бусте есть.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296115
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне больше "нравится", что итераторы могут становиться невалидными и делятся на кучу несовместимых и специфических подтипов - константные, двунаправленные итп

И тексты ошибки, которые при неверной подстановке генерятся =)

Модератор: Прояснил сарказм, поставил "нравится" в кавычки. Правильно ?
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296188
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivСкажите, может ли функция в C++ вернуть более одного значения?

Нет, не может.
std::pair чем не более одного? ))
MasterZivА скажите, как задается диапазон для обработки контейнера в любой функции STL?

Парой итераторов, так?

Ну и о чем думал этот Степанов, где у него мозги- то были? Как вызовы функций STL каскадировать?
Написать обертку над стандартным шаблоном которая вместо двух итераторов принимает pair.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296250
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyMasterZivСкажите, может ли функция в C++ вернуть более одного значения?

Нет, не может.
std::pair чем не более одного? ))
MasterZivА скажите, как задается диапазон для обработки контейнера в любой функции STL?

Парой итераторов, так?

Ну и о чем думал этот Степанов, где у него мозги- то были? Как вызовы функций STL каскадировать?
Написать обертку над стандартным шаблоном которая вместо двух итераторов принимает pair.

Так это должно было сразу ему на ум прийти!
Сейчас-то и boost::range есть...
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296273
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто будет очередной топик плача по хорошему языку С++, который мог бы быть еще лучше, но стал хуже.

Виноват в этом один человек, по фамилии Степанов. Ну и конечно другой человек Страустрап, который ему потакал в этом...

Скажите, может ли функция в C++ вернуть более одного значения?

Нет, не может.


std::tuple.

MasterZivА скажите, как задается диапазон для обработки контейнера в любой функции STL?

Парой итераторов, так?

А ты хотел чтобы алгоритмы принимали tuple'ы или что-то подобное? Нет. Они же всё-таки обобщённые и было бы сомнительно вводить тип range. Можешь сам в namespace std добавить соответствующие перегрузки, учитывая, что теперь есть std::begin и std::end

MasterZivНу и о чем думал этот Степанов, где у него мозги- то были? Как вызовы функций STL каскадировать ?

Пардоньте? Этот реквест boost::adaptors?

MasterZivМожно только создавать новые и новые переменные и копировать данные, сейчас есть move semantics, а тогда-то не было...

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

Москва не сразу строилась (С)
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296449
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было бы интересно посмотреть проблемный кейз и разные варианты решений.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296461
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, я не ищу решения проблемы "на сейчас", оно в общем очевидно.
Я пытаюсь сказать о том, что STL -- это библиотека с изначально плохим дизайном.
В 90-х не было буста, который всё исправляет, не было С++11.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296467
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА ты хотел чтобы алгоритмы принимали tuple'ы или что-то подобное?

Хотел бы иногда...
Собственно, при программировании std::map до них допёрло, что нужно multivalue начинать использовать,
а во всех остальных случаях -- нет...

авторНет. Они же всё-таки обобщённые и было бы сомнительно вводить тип range.


А чем тебе range-и необобщённые или сомнительные ?
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296508
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предположу, что при проектировании С++ хотели сохранить совместимость с языком С по максимуму насколько это возможно. А целью введения итераторов было обобщить концепцию указателей языка С так, что в алгоритмах можно будет использовать как указатели, так и итераторы. Вы же можете передать обычные указатели в алгоритмы STL. STL - это не худшее, а то, что было определено изначальной целью сохранить как можно большую степень совместимости.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296520
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitprofПредположу, что при проектировании С++ хотели сохранить совместимость с языком С по максимуму насколько это возможно.


Так ну и где же там совместимость с С, в STL ?
Что вместо итераторов можно использовать указатели ?
А что, вместо указателей просто два смещения в последовательности (номера начала и конца обрабатываемой подпоследовательности) нельзя было использовать?

vitprofА целью введения итераторов было обобщить концепцию указателей языка С так, что в алгоритмах можно будет использовать как указатели, так и итераторы. Вы же можете передать обычные указатели в алгоритмы STL. STL - это не худшее, а то, что было определено изначальной целью сохранить как можно большую степень совместимости.


Не лучше ли было бы обобщать понятие "последовательность", индексируемая целыми неотрицательными числами,
чем плохо?
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296523
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, вот тут расписано хорошо, как должно было бы быть...
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296601
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivНе лучше ли было бы обобщать понятие "последовательность", индексируемая целыми неотрицательными числами,
чем плохо?

Подразумевает ли, по вашему, такая индексация существование доступа к элементу по индексу за O(1)? Иначе зачем вообще индексировать? А как вы будете делать итератор по дереву? И зачем в этом случае индексирование элементов?

Идея в бусте мне тоже нравится, позволяет сделать код компактнее.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296665
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitprofПодразумевает ли, по вашему, такая индексация существование доступа к элементу по индексу за O(1)?


Нет. Это вообще никак не связанные вещи.

vitprofИначе зачем вообще индексировать?


Я не понял.

vitprofА как вы будете делать итератор по дереву? И зачем в этом случае индексирование элементов?


Все алгоритмы обхода деревьев (графов), которые я знаю, предполагают если я не ошибаюсь расположение всех узлов
в последовательности их обхода, которая соотносится с множеством целых неотрицательных чисел.
Так что не вижу проблем.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296668
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivvitprofПодразумевает ли, по вашему, такая индексация существование доступа к элементу по индексу за O(1)?


Нет. Это вообще никак не связанные вещи.
Очень даже связанные.
MasterZivНе лучше ли было бы обобщать понятие "последовательность", индексируемая целыми неотрицательными числами,
чем плохо?
Именно тем и плохо что даже при O(1) будет медленнее чем сейчас.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296676
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мдя... Степанов - типичный промышленник. Не математик. И я думаю что у него
инженерная мысль преобладала над теоретической или математической.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296686
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Степанов у меня ассоциируется только вот с этим текстом . Давно про него ничего не слышно.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296692
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivВообще, вот тут расписано хорошо, как должно было бы быть...

Не, это слишком красиво получается, так нельзя, где же итераторы, генераторы, указатели: http://melpon.org/wandbox/permlink/RWpimapjAr4immS5
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include <iostream>
#include <boost/range/algorithm.hpp>
#include <vector>

int main() 
{ 
    std::vector<int> vec = {1, 5, 3, 2, 1};
    boost::copy(boost::unique(boost::sort(vec)),
            std::ostream_iterator<int>(std::cout, ", "));
    
    return 0;
}



Интересно, хоть в <experimental> в C++17 это войдет?
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296698
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин,
вот от том и речь...
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296699
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
войдет или нет - другой вопрос, Кто мешал так сделать сразу, еще в 90?
за двадцать лет у людей на порядок в лучшую сторону мозги изменились?
нет.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296707
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинНе, это слишком красиво получается, так нельзя, где же итераторы, генераторы, указатели: http://melpon.org/wandbox/permlink/RWpimapjAr4immS5
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include <iostream>
#include <boost/range/algorithm.hpp>
#include <vector>

int main() 
{ 
    std::vector<int> vec = {1, 5, 3, 2, 1};
    boost::copy(boost::unique(boost::sort(vec)),
            std::ostream_iterator<int>(std::cout, ", "));
    
    return 0;
}



А можно какой-то другой пример? А то я че-то не сильно вижу преимущества по сравнению со следующим эквивалентным кодом на STL.
Код: plaintext
1.
2.
3.
4.
5.
6.
    
    std::vector<int> vec = {1, 5, 3, 2, 1};
    std::sort(vec.begin(), vec.end());
    auto unique_end = std::unique(vec.begin(), vec.end());
    std::copy(vec.begin(), unique_end,
            std::ostream_iterator<int>(std::cout, ", "));
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296727
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivвойдет или нет - другой вопрос, Кто мешал так сделать сразу, еще в 90?
за двадцать лет у людей на порядок в лучшую сторону мозги изменились?
нет.
Здесь есть связь, если в 90х то там много поводов могло быть, начиная от совместимости с указателями С, до ручного определения когда inplace, а когда в другой массив копируем результат. Тогда boost-овых реализаций не было, а в C++ было куча других проблем.
А вот почему в C++11 это не сделали, когда уже готовые реализации были и все плюсы видны?


Без boost можно получить тот же результат, не так же красиво, но поиграться можно: http://melpon.org/wandbox/permlink/WZ3UgdcGitcng1hD
Код: plaintext
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.
30.
31.
32.
#include <iostream>
#include <vector>
#include <algorithm>
#include <type_traits>
#include <iterator>

#include <boost/range/algorithm.hpp>


#define RANGE(func, vec, ...) tmp_func(vec, [&]() { return func(vec.begin(), vec.end(), ##__VA_ARGS__); } )

template<typename T_vec, typename T_func>
auto tmp_func(T_vec &vec, T_func const& func) -> typename std::enable_if< std::is_void<decltype(func())>::value, T_vec& >::type 
{ func(); return vec; }

template<typename T_vec, typename T_func>
auto tmp_func(T_vec &vec, T_func const& func) -> typename std::enable_if< std::is_same<decltype(func()), decltype(vec.begin())>::value, T_vec& >::type 
{ auto it = func(); vec.resize(it - vec.begin()); return vec; }

template<typename T_vec, typename T_func>
auto tmp_func(T_vec &vec, T_func const& func) -> typename std::enable_if< !std::is_void<decltype(func())>::value && !std::is_same<decltype(func()), decltype(vec.begin())>::value, T_vec& >::type 
{ func(); return vec; }


int main() 
{ 
    std::vector<int> vec2 = {1, 5, 3, 2, 1, 1};    
    //boost::copy(boost::unique(boost::sort(vec)), std::ostream_iterator<int>(std::cout, ", "));
    RANGE(std::copy, RANGE(std::unique, RANGE(std::sort, vec2) ), std::ostream_iterator<int>(std::cout, ", "));

    return 0;
}
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296728
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин,

Я вот не пойму все-таки, с чего это вдруг каскадирование - это плюс? Как и вообще функциональные идиомы )))
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296733
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyВася УткинНе, это слишком красиво получается, так нельзя, где же итераторы, генераторы, указатели: http://melpon.org/wandbox/permlink/RWpimapjAr4immS5
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include <iostream>
#include <boost/range/algorithm.hpp>
#include <vector>

int main() 
{ 
    std::vector<int> vec = {1, 5, 3, 2, 1};
    boost::copy(boost::unique(boost::sort(vec)),
            std::ostream_iterator<int>(std::cout, ", "));
    
    return 0;
}



А можно какой-то другой пример? А то я че-то не сильно вижу преимущества по сравнению со следующим эквивалентным кодом на STL.
Код: plaintext
1.
2.
3.
4.
5.
6.
    
    std::vector<int> vec = {1, 5, 3, 2, 1};
    std::sort(vec.begin(), vec.end());
    auto unique_end = std::unique(vec.begin(), vec.end());
    std::copy(vec.begin(), unique_end,
            std::ostream_iterator<int>(std::cout, ", "));


90 символов против 210 :)

Anatoly MoskovskyВася Уткин,

Я вот не пойму все-таки, с чего это вдруг каскадирование - это плюс? Как и вообще функциональные идиомы )))
Ну до auto это было супер круто - избавление от километровых объявлений итераторов.
А сейчас пара плюсов:
1. короче код и сразу понятно, что делает
2. итераторы - это лишняя возможность вынести работу с разделяемым контейнером за критическую секцию при многопоточности
3. хорошо сочетается с execute around idiom

Хотя непонятно насколько это удобно будет для алгоритмов работающих сразу с несколькими векторами, и возвращающих несколько векторов.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296735
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин1. короче код и сразу понятно, что делает
Наоборот. Функциональная запись предполагает отсутствие побочных эффектов. А там - один на другом )))
Поэтому вовсе не понятно что там происходит.
Да и чисто с практической точки зрения, запись в одну большую формулу почти всегда менее читаема чем разбитый на простые шаги код.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296737
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyВася Уткин1. короче код и сразу понятно, что делает
Наоборот. Функциональная запись предполагает отсутствие побочных эффектов. А там - один на другом )))
Поэтому вовсе не понятно что там происходит.
Да и чисто с практической точки зрения, запись в одну большую формулу почти всегда менее читаема чем разбитый на простые шаги код.
Не знаю, мне все понятно, никаких побочных эффектов, только нужные
Хотя такая запись была бы понятней:
Код: plaintext
1.
boost::sort(vec)->unique()->copy( std::ostream_iterator<int>(std::cout, ", ") );


чем такая:
Код: plaintext
1.
boost::copy(boost::unique(boost::sort(vec)), std::ostream_iterator<int>(std::cout, ", "));
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296743
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинНе знаю, мне все понятно, никаких побочных эффектов, только нужные
Это тут понятно, с тривиальным примером.
Вася УткинХотя такая запись была бы понятней:
Код: plaintext
1.
boost::sort(vec)->unique()->copy( std::ostream_iterator<int>(std::cout, ", ") );


Ну, такая возможность (uniform call syntax) предложена в стандарт. Но пока не договорились (Саттер против Страуструпа).
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296745
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВася УткинНе знаю, мне все понятно, никаких побочных эффектов, только нужные
Это тут понятно, с тривиальным примером.
Вася УткинХотя такая запись была бы понятней:
Код: plaintext
1.
boost::sort(vec)->unique()->copy( std::ostream_iterator<int>(std::cout, ", ") );


Ну, такая возможность (uniform call syntax) предложена в стандарт. Но пока не договорились (Саттер против Страуструпа).

А почему Страуструп против? Самый понятный код из всех представленных здесь
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296747
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА почему Страуструп против?
Они оба за. Не сошлись в деталях ))
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296787
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivvitprofА как вы будете делать итератор по дереву? И зачем в этом случае индексирование элементов?


Все алгоритмы обхода деревьев (графов), которые я знаю, предполагают если я не ошибаюсь расположение всех узлов
в последовательности их обхода, которая соотносится с множеством целых неотрицательных чисел.
Так что не вижу проблем.
проблема в вычислительной сложности такого обхода, доступ по индексу за логарифмическое время возможен на довольно экзотических деревьях типа весо-сбалансированного

двусвязный список и производные вроде LinkedHashMap вообще индексировать не очень получится
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296816
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)MasterZivпропущено...
Все алгоритмы обхода деревьев (графов), которые я знаю, предполагают если я не ошибаюсь расположение всех узлов
в последовательности их обхода, которая соотносится с множеством целых неотрицательных чисел.
Так что не вижу проблем.
проблема в вычислительной сложности такого обхода, доступ по индексу за логарифмическое время возможен на довольно экзотических деревьях типа весо-сбалансированного
двусвязный список и производные вроде LinkedHashMap вообще индексировать не очень получится

Ну да, если не требуется доступ по индексу к элементу, либо такой доступ не рационален, то смысла в индексации (нумерации) элементов нет.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39296826
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВася Уткин1. короче код и сразу понятно, что делает
Наоборот. Функциональная запись предполагает отсутствие побочных эффектов. А там - один на другом )))


ФП предполагает отсутствие побочных эффектов, да.
И для этого каждая функция должа свой результат возвращать в виде выходного значения.
Можешь мне рассказать, как такое можно сделать в С++ на паре итераторов ?
Вот о том и речь, собственно, с этого всё и началось.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39297068
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivAnatoly Moskovskyпропущено...

Наоборот. Функциональная запись предполагает отсутствие побочных эффектов. А там - один на другом )))


ФП предполагает отсутствие побочных эффектов, да.
И для этого каждая функция должа свой результат возвращать в виде выходного значения.
Можешь мне рассказать, как такое можно сделать в С++ на паре итераторов ?
Вот о том и речь, собственно, с этого всё и началось.
Ну тогда и boost-овая реализация не совсем то - она меняет исходный вектор: http://melpon.org/wandbox/permlink/ANBEoapWX20DCrRc
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39297091
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivИ для этого каждая функция должа свой результат возвращать в виде выходного значения.
Можешь мне рассказать, как такое можно сделать в С++ на паре итераторов ?
Вот о том и речь, собственно, с этого всё и началось.
Ну вот там выше бустовские range, которые по-вашему пример того как должно быть.
Но это всего лишь синтаксический сахар над итераторами.
Суть их та же - аргументы когда надо модифицируются по месту, а не возвращаются копией.
Поэтому суть ваших претензий к итераторам, при одобрении range, непонятна. ))
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39297092
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинMasterZivпропущено...


ФП предполагает отсутствие побочных эффектов, да.
И для этого каждая функция должа свой результат возвращать в виде выходного значения.
Можешь мне рассказать, как такое можно сделать в С++ на паре итераторов ?
Вот о том и речь, собственно, с этого всё и началось.
Ну тогда и boost-овая реализация не совсем то - она меняет исходный вектор: http://melpon.org/wandbox/permlink/ANBEoapWX20DCrRc

Алгоритмы разные бывают, есть и те, которые не меняют.
Речь про другое, что если они не меняют, то они возвращают значение в виде итеретора-вставки.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39297106
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyВася УткинНе знаю, мне все понятно, никаких побочных эффектов, только нужные
Это тут понятно, с тривиальным примером.
Вася УткинХотя такая запись была бы понятней:
Код: plaintext
1.
boost::sort(vec)->unique()->copy( std::ostream_iterator<int>(std::cout, ", ") );


Ну, такая возможность (uniform call syntax) предложена в стандарт. Но пока не договорились (Саттер против Страуструпа).
Вот для inplace я сделал бы так:
Код: plaintext
1.
boost::sort(vec)->unique()->copy( std::ostream_iterator<int>(std::cout, ", ") );


А для работы в отдельном векторе так:
Код: plaintext
1.
boost::copy(vec)->sort()->unique()->copy( std::ostream_iterator<int>(std::cout, ", ") );



Причем именно через ->, а точку . бы захламлять не стал: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4474.pdf
Могли бы добавить ключ в GCC для включения Unified Call Syntax, чтобы люди проверили не ломает ли их код такая штука.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39297165
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинПричем именно через ->, а точку . бы захламлять не стал: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4474.pdf
Могли бы добавить ключ в GCC для включения Unified Call Syntax, чтобы люди проверили не ломает ли их код такая штука.

Не получится, там именно точка дожна быть, потому как возвращать они должны ПО ЗНАЧЕНИЮ.
Иначе надо было бы переопределять их, чтобы они возвращали указатели на непонятно кем созданные переменные
и непонятно кем их тогда удалять.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39297178
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНе получится, там именно точка дожна быть, потому как возвращать они должны ПО ЗНАЧЕНИЮ.
Иначе надо было бы переопределять их, чтобы они возвращали указатели на непонятно кем созданные переменные
и непонятно кем их тогда удалять.
Как раз то для чего нужен unique_ptr :)
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39298279
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получилось чето типа такого.
Код: plaintext
1.
ucs_vec->sort()->unique()->copy( std::ostream_iterator<int>(std::cout, ", ") );



Можно и с копией работать - 1й вариант, и с исходным вектором - 2й вариант.
В algo_t можно любых алгоритмов унифицированно понатыкать из <algorithm>

http://melpon.org/wandbox/permlink/DNWV0VGHWOz5XcrW
Код: plaintext
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
#include <iostream>
#include <vector>
#include <algorithm>
#include <type_traits>
#include <iterator>
#include <memory>

#include <boost/range/algorithm.hpp>


#define RANGE(func, vec, ...) tmp_func(vec, [&]() { return func(vec.begin(), vec.end(), ##__VA_ARGS__); } )

template<typename T_vec, typename T_func>
auto tmp_func(T_vec &vec, T_func const& func) -> typename std::enable_if< std::is_void<decltype(func())>::value, T_vec& >::type 
{ func(); return vec; }

template<typename T_vec, typename T_func>
auto tmp_func(T_vec &vec, T_func const& func) -> typename std::enable_if< std::is_same<decltype(func()), decltype(vec.begin())>::value, T_vec& >::type 
{ auto it = func(); vec.resize(it - vec.begin()); return vec; }

template<typename T_vec, typename T_func>
auto tmp_func(T_vec &vec, T_func const& func) -> typename std::enable_if< !std::is_void<decltype(func())>::value && !std::is_same<decltype(func()), decltype(vec.begin())>::value, T_vec& >::type 
{ func(); return vec; }


// ------------------------------------------------------
template<typename T> struct ucs_wrapper_t;
template<typename T> ucs_wrapper_t<T> ucs_wrapper(T &ref) { return ucs_wrapper_t<T>(ref); }

template<typename T>
struct ucs_wrapper_t 
{
    struct algo_t {
        T &ref;
        algo_t(T &src) : ref(src) {}
        auto copy() { return ucs_wrapper_t<T>(T(ref)); }          
        template<typename ...Args> auto copy(Args ...args) { return ucs_wrapper(RANGE(std::copy, ref, args...)); }
        template<typename ...Args> auto unique(Args ...args) { return ucs_wrapper(RANGE(std::unique, ref, args...)); }
        template<typename ...Args> auto sort(Args ...args) { return ucs_wrapper(RANGE(std::sort, ref, args...)); }
    };    
    
    T copied;
    std::unique_ptr<algo_t> algo_ptr;
    ucs_wrapper_t(T &src) : algo_ptr(new algo_t(src)) {}
    ucs_wrapper_t(T &&src) : copied(src), algo_ptr(new algo_t(copied)) {}
    std::unique_ptr<algo_t>& operator->() { return algo_ptr; }
};


int main() 
{ 
    std::vector<int> vec2 = {1, 5, 3, 2, 1, 1};    
    //boost::copy(boost::unique(boost::sort(vec)), std::ostream_iterator<int>(std::cout, ", "));
    //RANGE(std::copy, RANGE(std::unique, RANGE(std::sort, vec2) ), std::ostream_iterator<int>(std::cout, ", "));
    
    auto ucs_vec = ucs_wrapper(vec2);
    
    // work with copied vector
    ucs_vec->copy()->sort()->unique()->copy( std::ostream_iterator<int>(std::cout, ", ") );
    
    std::cout << std::endl;
    for(auto &i : vec2) std::cout << i << ", "; 
   
    // work with source vector
    std::cout << std::endl;
    ucs_vec->sort()->unique()->copy( std::ostream_iterator<int>(std::cout, ", ") );
    
    std::cout << std::endl;
    for(auto &i : vec2) std::cout << i << ", ";    

    return 0;
}


автор1, 2, 3, 5,
1, 5, 3, 2, 1, 1,
1, 2, 3, 5,
1, 2, 3, 5,
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39298808
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто будет очередной топик плача по хорошему языку С++, который мог бы быть еще лучше, но стал хуже.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39303671
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто будет очередной топик плача по хорошему языку С++, который мог бы быть еще лучше, но стал хуже.

Скажите, может ли функция в C++ вернуть более одного значения?
Нет, не может.
Читал хинты оракла. Много думал...[/i]

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <stdio.h>

typedef struct rt
{
    int t1;
    int v2;
}rt_t;

rt_t foo()
{
    rt_t val;
    val.t1 = 1;
    val.v2 = 5;

    return val;
}

int main()
{
    printf("%d-%d", foo().t1, foo().v2);
    return foo().t1;
}
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39303686
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepsik, это как:
- можно ли построить вечный двигатель?
- можно! надо только чтобы кто-то ручку постоянно крутил!
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39304070
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepsik, я внимательно прочел твое сообщение и не увидел смайлика.

Где смайлик?
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39304137
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonLepsik, я внимательно прочел твое сообщение и не увидел смайлика.

Где смайлик?

Да не все совершенно в Ц++, но всегда есть куда двигатся.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39304139
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepsikДа не все совершенно в Ц++, но всегда есть куда двигатся.
в недобрый час вы про это заговорили

как вам такой синтаксис?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
(bool, int, long) funk (...)
{
	//...
	return iVar, bVal, lVar;
}
//
iVar, bVar, lVer = funk(...);




а вообще про параметры-ссылки кто-нибудь ещё помнит?
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39304171
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbа вообще про параметры-ссылки кто-нибудь ещё помнит?

Про параметры-ссылки помнят все. Но надо еще вспомнить про рекурсию.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39304172
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepsikmaytonLepsik, я внимательно прочел твое сообщение и не увидел смайлика.

Где смайлик?

Да не все совершенно в Ц++, но всегда есть куда двигатся.

А ладно... ты меня не понял.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39304279
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПро параметры-ссылки помнят все. Но надо еще вспомнить про рекурсию.с т.з. рекурсии нет разницы, как возвращать результаты. Или я тоже тебя не понял?
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39304551
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbкак вам такой синтаксис?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
(bool, int, long) funk (...)
{
	//...
	return iVar, bVal, lVar;
}
//
iVar, bVar, lVer = funk(...);


Так вот же:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
std::tuple<bool, int, long> funk (...)
{
	//...
	return {iVar, bVal, lVar};
}
//
auto [iVar, bVar, lVer] = funk(...); // C++17
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39304699
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, boost::range хорошо лечит исходную проблему топика .
Изучать, использую, нравится...
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39304717
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbmaytonПро параметры-ссылки помнят все. Но надо еще вспомнить про рекурсию.с т.з. рекурсии нет разницы, как возвращать результаты. Или я тоже тебя не понял?
Я боюсь что мы друг друга не поняли. Нарисуй пожалуйста твой пример с возвратом трех параметров из фунции через ссылки
и я дополню твой пример своей мыслью.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39304729
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
А можно вот этот пример дополнить этой же мыслью? ))
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
void factorial(int n, int& res)
{
    if (n < 2) {
        res = 1;
    }
    else {
        factorial(n - 1, res);
        res *= n;
    }
}

...
int res;
factorial(5, res);
cout << res << endl;
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39304737
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, это весьма неудачный пример расчета факториала.

Я по сабжу вообще скептически относился ко всем подобным "удачным" примерам рекурсии.
Но данный пример еще плох тем что он не safe-threaded. Но в любом случае данный
пример плох. С одним ссылочным аргументом или с тремя.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39304767
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonпример плох
Пока получается что пример плох, потому что выясняется что рекурсия возврату по ссылке не помеха.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39304798
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyТак вот жеухты, спасибо. А return{...} - это с++14? Хотя вроде бы инициализация листом была в C++11? В общем, у меня в 2013 не компилится, только make_tuple.
Код: plaintext
1.
auto [iVar, bVar, lVer] = funk(...);

std:tie есть, оказывается. Почти тоже самое
Код: plaintext
1.
std:tie(iVar, bVar, lVer] = funk(...);


maytonНо данный пример еще плох тем что он не safe-threadedя, конечно, новичок во всех этих с++-ных операциях, но мне кажется, что safe-threaded тут ни причём, тут ФП в чистом виде.
Нарисуй пожалуйста твой пример с возвратом трех параметров из фунции через ссылкину пусть будет так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void factorial(int n, int& iRes, int& iDouble, int& iTrouble)
{
    if (n < 2) {
        iRes = 1;
    }
    else {
        factorial(n - 1, iRes, iDouble, iTrouble);
        iRes *= n;
        iDouble = 2 * iRes;
        iTrouble = 3 * iRes;
    }
}
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39305160
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbА return{...} - это с++14? Хотя вроде бы инициализация листом была в C++11? В общем, у меня в 2013 не компилится, только make_tuple.
Это С++11. Просто Студия 2013 видимо не все поддерживает.
CEMbчто safe-threaded тут ни причём
Конечно не причем. Там с потокобезопасностью все ок. mayton как обычно себе нафантазировал )))
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39305175
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, что вы спорите ?
Конечно, функциональное программирование в чистом виде (почти)невозможно в С++, особенно с использованием STL.
Потому что функции (алгоритмы STL) НЕ ВОЗВРАЩАЮТ свой результат.

Но ПСЕВДОфункциональное программирование, т.е. программирование с использованием функций высших порядков
и без использования императивного кода (if, while, for) для обработки данных вполне себе возможно.

Это нельзя назвать ФП, но элементы ФП в этом есть.
...
Рейтинг: 0 / 0
Ненавижу итератор...
    #39305198
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivРебята, что вы спорите ?
Это же очевидно - мы спорим про ненависть к итераторам )))
...
Рейтинг: 0 / 0
58 сообщений из 58, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ненавижу итератор...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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