Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ненавижу итератор... / 25 сообщений из 58, страница 1 из 3
23.08.2016, 10:37
    #39296009
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ненавижу итератор...
Это будет очередной топик плача по хорошему языку С++, который мог бы быть еще лучше, но стал хуже.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Так это должно было сразу ему на ум прийти!
Сейчас-то и boost::range есть...
...
Рейтинг: 0 / 0
23.08.2016, 14:05
    #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
23.08.2016, 16:04
    #39296449
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ненавижу итератор...
Было бы интересно посмотреть проблемный кейз и разные варианты решений.
...
Рейтинг: 0 / 0
23.08.2016, 16:14
    #39296461
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ненавижу итератор...
Ребята, я не ищу решения проблемы "на сейчас", оно в общем очевидно.
Я пытаюсь сказать о том, что STL -- это библиотека с изначально плохим дизайном.
В 90-х не было буста, который всё исправляет, не было С++11.
...
Рейтинг: 0 / 0
23.08.2016, 16:18
    #39296467
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ненавижу итератор...
авторА ты хотел чтобы алгоритмы принимали tuple'ы или что-то подобное?

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

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


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


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

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


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

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

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


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

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


Я не понял.

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


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


Нет. Это вообще никак не связанные вещи.
Очень даже связанные.
MasterZivНе лучше ли было бы обобщать понятие "последовательность", индексируемая целыми неотрицательными числами,
чем плохо?
Именно тем и плохо что даже при O(1) будет медленнее чем сейчас.
...
Рейтинг: 0 / 0
23.08.2016, 21:30
    #39296676
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ненавижу итератор...
Мдя... Степанов - типичный промышленник. Не математик. И я думаю что у него
инженерная мысль преобладала над теоретической или математической.
...
Рейтинг: 0 / 0
23.08.2016, 21:49
    #39296686
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ненавижу итератор...
Степанов у меня ассоциируется только вот с этим текстом . Давно про него ничего не слышно.
...
Рейтинг: 0 / 0
23.08.2016, 22:23
    #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
23.08.2016, 23:13
    #39296698
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ненавижу итератор...
Вася Уткин,
вот от том и речь...
...
Рейтинг: 0 / 0
23.08.2016, 23:15
    #39296699
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ненавижу итератор...
войдет или нет - другой вопрос, Кто мешал так сделать сразу, еще в 90?
за двадцать лет у людей на порядок в лучшую сторону мозги изменились?
нет.
...
Рейтинг: 0 / 0
23.08.2016, 23:53
    #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
24.08.2016, 01:28
    #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
24.08.2016, 01:53
    #39296728
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ненавижу итератор...
Вася Уткин,

Я вот не пойму все-таки, с чего это вдруг каскадирование - это плюс? Как и вообще функциональные идиомы )))
...
Рейтинг: 0 / 0
24.08.2016, 02:18
    #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
24.08.2016, 02:31
    #39296735
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ненавижу итератор...
Вася Уткин1. короче код и сразу понятно, что делает
Наоборот. Функциональная запись предполагает отсутствие побочных эффектов. А там - один на другом )))
Поэтому вовсе не понятно что там происходит.
Да и чисто с практической точки зрения, запись в одну большую формулу почти всегда менее читаема чем разбитый на простые шаги код.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ненавижу итератор... / 25 сообщений из 58, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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