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


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