powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ненавижу итератор...
25 сообщений из 58, страница 2 из 3
Ненавижу итератор...
    #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
25 сообщений из 58, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ненавижу итератор...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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