Здравствуйте, rumit7, Вы писали:
R>Здравствуйте, Сыроежка, Вы писали:
С>>Я согласен, что ключ является константным, тем не мене само отображаемое значение не является константным.
R>Прекратите прыгать из стороны в сторону. Цитаты из стандарта я привел в ответ на то, что стандарт что-то там нарушает. Вот Ваше же высказывание:
R>
R>Кстати сказать, вы хорошо сделали, что напомнили стандарт. Если вы посмотрите главу 25 стандарта, где описаны стандартные алгоритмы, и параграф, где описан непосредственно алгоритм std::reverse, то единственные требования к этому алгоритму — это чтобы был по итератор не ниже двустороннего, а величины, на которые указывает итератор, были бы заменяемы, то есть могли использовать swap. Никаких других ограничений нет, и тем более нет упоминания в качестве иселючения для применения контейнера std::map. Это обязательство стандарта по применению алгоритма. И сам же стандарт его нарушает.
R>Так что — нарушает стандарт или нет?
Обратите внимание нра эту часть стандарта:
"3 The context in which swap(t, u) and swap(u, t) are evaluated shall ensure that a binary non-member
function named “swap” is selected via overload resolution (13.3) on a candidate set that includes:
— the two swap function templates defined in <utility> (20.2) and
— the lookup set produced by argument-dependent lookup (3.4.2)."
Здравствуйте, Сыроежка, Вы писали:
С>Здравствуйте, rumit7, Вы писали:
R>>Здравствуйте, Сыроежка, Вы писали:
С>>>Я согласен, что ключ является константным, тем не мене само отображаемое значение не является константным.
R>>Прекратите прыгать из стороны в сторону. Цитаты из стандарта я привел в ответ на то, что стандарт что-то там нарушает. Вот Ваше же высказывание:
R>>
R>>Кстати сказать, вы хорошо сделали, что напомнили стандарт. Если вы посмотрите главу 25 стандарта, где описаны стандартные алгоритмы, и параграф, где описан непосредственно алгоритм std::reverse, то единственные требования к этому алгоритму — это чтобы был по итератор не ниже двустороннего, а величины, на которые указывает итератор, были бы заменяемы, то есть могли использовать swap. Никаких других ограничений нет, и тем более нет упоминания в качестве иселючения для применения контейнера std::map. Это обязательство стандарта по применению алгоритма. И сам же стандарт его нарушает.
R>>Так что — нарушает стандарт или нет?
С>Здесь не все так просто, как кажэется,
Я задал простой вопрос. На простой вопрос можно ответить просто — да или нет.
С>так как вы можете специализировать функцию swap для элементов вашего контейнера. Так что это на усмотрение пользователя контейнера, предоставляет он такую функцию или нет.
Это все отмазки.. Поменьше кидайтесь громкими фразами, реже придется выглядить глупо..
Re[20]: Разместить в обратном порядке отображаемые значения
Здравствуйте, Igore, Вы писали:
I>Здравствуйте, Сыроежка, Вы писали:
С>>Здравствуйте, Igore, Вы писали:
I>>>Здравствуйте, Сыроежка, Вы писали:
I>>>>>std::map<int, int> не равен std::vector<int>, std::map<int, int> приблизительно равен std::vector<std::pair<int, int>>, ты забываешь простые вещи, stl контейнеры гарантируют времена: доступ к элементу, вставки, удаление. Ты в свою угоду хочешь все выкинуть. В общем флаг тебе в руки, напиши свою STL выложи в общий доступ и завоевывай пользователей.
I>>>>>И я не понимаю в чем для тебя сложность написать 3 строчки кода который будет переворачивать значения map. В стандарте много чего нету, пиши свою библиотеку и используй ее.
С>>>>Так сложности нет и в том, чтобы написать все стандартные алгоритмы! I>>>Раз нет сложности, то напиши и используй.
С>>>>Только зачем каждый раз это делать, вы можете объяснить? I>>>Не могу объяснить, пишешь 1 раз и используешь во всех своих проектах, зачем каждый раз писать надо у тебя спросить
С>>>>Зачем программистам каждый раз изобретать велосипед. более того привденный здесь в самом начале пример кода такоого доморощенного алгоритма, говорит о том, что это чревато лишь ошибками! То есть приведенный кодт не просто плох, он не выполняет поставленной задачи, если рассматривать не весь контейнер, а некоторый его диапазон, так как в коде используется функция-член класса size(). С>>>>Я уже написал, какую нужно включить в стандарт форму алгоритма reverse, чтобы вопрос был решен достаточно просто.
I>>>Изобретением велосипеда пока занимаешься только ты, бери стандартные контейнеры, стандартные алгоритмы и используй их. Любую задачу можно решать множеством путей, то что ты видишь только 1 и он не находится в STL ни о чем не говорит. I>>>Даже если вас съели, у вас как минимум два выхода.
С>>Вызнаете разницу между тем, что алгоритм присутствует в стандарте, и во всех проектах используется этот алгоритм, и тем, что в каждом команда разрабатывает свой алгоритм? I>Повторю еще раз, то что тебе написали, пиши в комитет с просьбой включения в стандарт нового алгоритма. Или создай свою STL с блэкджеком и ну ты понял, разрекламируй ее и может она станет еще одним de facto, как буст, можешь туда попробовать добавить свои идеи
С>>В том-то и проблема, что как раз в стандарте не хватает той формы алгоритма, которую я здесь уже привел. Она органически всотребована для многих задач. Даже если рассмотреть аткую простую задачу, как если бы вектор хранилл в качестве элементов некую структуру, и нужно реверсировать не целиком всю структуру, а лишь некоторые ее поля, то уже возникает сложность, так как нет подходящего средства!
I>Тебе уже несколько раз объясняли, я повторю, map<int, int> = vector<pair<const int, int>>, тогда reverse это просто обход в обратном порядке, так как лезть во внутренее устройства map мы не можем.
С>>реверсировать не целиком всю структуру, а лишь некоторые ее поля I>Это трансформация а не реверсирование.
I>Реверсирование просто и понятно, а тебе хочется немного другого, я бы на твоем месте сменил тип контейнера и не мучился I>
А реверсирование в частности и является трансформацией исходной последовательностиЮ если не используется форма с copy. Так что одного обхода не достатоноч. Что делать, если нужно изменить существующие значения?!
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Сыроежка, Вы писали:
С>>Я как раз не вижу ничего осмысленного в этом пути. Это как раз путь через одно место. Нужно использовать третьестороннюю библиотеку, которую не всегда разоешается использовать в проектах. Во-вторых, нужны всякие преобразования итераторов, которые затрудняют чтение кода. Так что я с вами не сооглашусь. J>Ничего они не затрудняют в пользовательском коде, посмотри на boost.range.
С>>Самый простой пути — это тот, который я привел в вииде конерктного кода. Он совершенно ясен для читающегог код и не требует никаких ухищрений. Более того эту форму алгоритма можно использзовать не обязательно с sttd::map, но и в ттех случаях, когда надо реверсировать не полностью элемент такой, как, например, структура, а лишь отдельные ее члены. Тогда у вас снова возникает трудноразрешимая задача, если у вас нет такой формы алгоритма.
J>Тебе придется написать такого рода специальные версии всех остальных алгоритмов, которые полагаются на swap (а в С++11 — еще и move). J>random_shuffle, например, да и sort туда же.
Пока что достаточно хотя бы добавить новую форму для reverse. Это уже было бы прогрессом и решало множество задач, которые без наличия такой формы алгоритма решить не просто.
Здравствуйте, rumit7, Вы писали:
R>Здравствуйте, Сыроежка, Вы писали:
С>>Здравствуйте, rumit7, Вы писали:
R>>>Здравствуйте, Сыроежка, Вы писали:
С>>>>Я согласен, что ключ является константным, тем не мене само отображаемое значение не является константным.
R>>>Прекратите прыгать из стороны в сторону. Цитаты из стандарта я привел в ответ на то, что стандарт что-то там нарушает. Вот Ваше же высказывание:
R>>>
R>>>Кстати сказать, вы хорошо сделали, что напомнили стандарт. Если вы посмотрите главу 25 стандарта, где описаны стандартные алгоритмы, и параграф, где описан непосредственно алгоритм std::reverse, то единственные требования к этому алгоритму — это чтобы был по итератор не ниже двустороннего, а величины, на которые указывает итератор, были бы заменяемы, то есть могли использовать swap. Никаких других ограничений нет, и тем более нет упоминания в качестве иселючения для применения контейнера std::map. Это обязательство стандарта по применению алгоритма. И сам же стандарт его нарушает.
R>>>Так что — нарушает стандарт или нет?
С>>Здесь не все так просто, как кажэется,
R>Я задал простой вопрос. На простой вопрос можно ответить просто — да или нет.
С>>так как вы можете специализировать функцию swap для элементов вашего контейнера. Так что это на усмотрение пользователя контейнера, предоставляет он такую функцию или нет.
R>Это все отмазки.. Поменьше кидайтесь громкими фразами, реже придется выглядить глупо..
Это не отговорки. Вы в своем пространстве имен заводите функцию swap для вашей специализации класса std:::paiir, и получаете swapable элементы контейнера.
То есть фоормально сттандарт говорит о том, есть ли у него под рукой функция swap, которую он может применить или нет. Это уже на ваше усмотрение, предоставлять компилятору такую функцию или нет.
Здравствуйте, Сыроежка, Вы писали:
J>>Тебе придется написать такого рода специальные версии всех остальных алгоритмов, которые полагаются на swap (а в С++11 — еще и move). J>>random_shuffle, например, да и sort туда же.
С>Пока что достаточно хотя бы добавить новую форму для reverse. Это уже было бы прогрессом и решало множество задач, которые без наличия такой формы алгоритма решить не просто.
Абсолютно недостаточно. Как только ты включишь эту версию reverse в стандарт, тут же появится Сыроежка2, который объявит отсутствие аналогичных версий всех остальных обменивающих алгоритмов "существенным упущением стандарта". Так что либо все, либо ничего.
Здравствуйте, Сыроежка, Вы писали:
С>Здравствуйте, rumit7, Вы писали:
R>>Здравствуйте, Сыроежка, Вы писали:
С>>>Здравствуйте, rumit7, Вы писали:
R>>>>Здравствуйте, Сыроежка, Вы писали:
С>>>>>Я согласен, что ключ является константным, тем не мене само отображаемое значение не является константным.
R>>>>Прекратите прыгать из стороны в сторону. Цитаты из стандарта я привел в ответ на то, что стандарт что-то там нарушает. Вот Ваше же высказывание:
R>>>>
R>>>>Кстати сказать, вы хорошо сделали, что напомнили стандарт. Если вы посмотрите главу 25 стандарта, где описаны стандартные алгоритмы, и параграф, где описан непосредственно алгоритм std::reverse, то единственные требования к этому алгоритму — это чтобы был по итератор не ниже двустороннего, а величины, на которые указывает итератор, были бы заменяемы, то есть могли использовать swap. Никаких других ограничений нет, и тем более нет упоминания в качестве иселючения для применения контейнера std::map. Это обязательство стандарта по применению алгоритма. И сам же стандарт его нарушает.
R>>>>Так что — нарушает стандарт или нет?
С>>>Здесь не все так просто, как кажэется,
R>>Я задал простой вопрос. На простой вопрос можно ответить просто — да или нет.
С>>>так как вы можете специализировать функцию swap для элементов вашего контейнера. Так что это на усмотрение пользователя контейнера, предоставляет он такую функцию или нет.
R>>Это все отмазки.. Поменьше кидайтесь громкими фразами, реже придется выглядить глупо..
С>Это не отговорки. Вы в своем пространстве имен заводите функцию swap для вашей специализации класса std:::paiir, и получаете swapable элементы контейнера. С>То есть фоормально сттандарт говорит о том, есть ли у него под рукой функция swap, которую он может применить или нет. Это уже на ваше усмотрение, предоставлять компилятору такую функцию или нет.
Ну в общем Вы признаете себя пустословом! Удачного Вам выпендрежа на Вашем любимом форуме..
Re[25]: Разместить в обратном порядке отображаемые значения
Это аналогично тому, предоставляете ли вы конструктор копирования, или не предоставляете его для класса, делая закрытым. если предоставляете, то у вас элемент удовлетворять требованию копируемости. А не предоставите, то не будет удовлетворять этому требованиб. Но все это на ваше усмотрение.
Здравствуйте, Сыроежка, Вы писали:
С>Здравствуйте, Centaur, Вы писали:
C>>Здравствуйте, Сыроежка, Вы писали:
С>>>Задача простая: для заданного контейнера std::map реверсировать отображаемые значения. С>>>Хочу понять, почему такой алгоритм не включен в качестве функции-члена класса std::map.
C>>Потому что эта операция в общем случае неосмысленна.
С>Не говорите "гоп" пока не перепрыгнули! Это для вас она сейчас является неосмысленной, потому что вы не в состоянии сейчас что-то придумать. А практика показывает, что существующие задачи настолько разнообразны, что не хватит никакой фантазии человека, чтобы представить все задачи, с которыми стаокивается программист!
И это всё должны были учитывать авторы архитектуры стандартных контейнеров N лет назад?
Вы не находите противоречия в своих запросах?
PS А потом понадобится менять жлемены через 1 и снова.
Re[26]: Разместить в обратном порядке отображаемые значения
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Сыроежка, Вы писали:
J>>>Тебе придется написать такого рода специальные версии всех остальных алгоритмов, которые полагаются на swap (а в С++11 — еще и move). J>>>random_shuffle, например, да и sort туда же.
С>>Пока что достаточно хотя бы добавить новую форму для reverse. Это уже было бы прогрессом и решало множество задач, которые без наличия такой формы алгоритма решить не просто.
J>Абсолютно недостаточно. Как только ты включишь эту версию reverse в стандарт, тут же появится Сыроежка2, который объявит отсутствие аналогичных версий всех остальных обменивающих алгоритмов "существенным упущением стандарта". Так что либо все, либо ничего.
Я вам больше скажу, у мен только версий алгоритма for_each около 20, если мне память не изменяет. И я не виижу причин не включить их в стандарт. напротив, в своей рпактике я всегда сталкивался с ненужными ограничениями и изобретением велосипеда.
Сами подумайте, например, насколько бы был полезен алгоритм for_each_if
ксати сказать, вы забыли, что в стандарт включены такие примитивные алгоримты, как all_of и any_of. Так что помимо Сыроежек хватает и других программистов!
Здравствуйте, blackhearted, Вы писали:
B>Здравствуйте, Сыроежка, Вы писали:
С>>Здравствуйте, Centaur, Вы писали:
C>>>Здравствуйте, Сыроежка, Вы писали:
С>>>>Задача простая: для заданного контейнера std::map реверсировать отображаемые значения. С>>>>Хочу понять, почему такой алгоритм не включен в качестве функции-члена класса std::map.
C>>>Потому что эта операция в общем случае неосмысленна.
С>>Не говорите "гоп" пока не перепрыгнули! Это для вас она сейчас является неосмысленной, потому что вы не в состоянии сейчас что-то придумать. А практика показывает, что существующие задачи настолько разнообразны, что не хватит никакой фантазии человека, чтобы представить все задачи, с которыми стаокивается программист!
B>И это всё должны были учитывать авторы архитектуры стандартных контейнеров N лет назад? B>Вы не находите противоречия в своих запросах?
B>PS А потом понадобится менять жлемены через 1 и снова.
Нет, у меня таких претензий нет. Как раз напротив, я вижу, что стандарт развивается в том направдлении, которое я себе представляю. например, я уже отметил положительные стороны развития адаптеров контейнеров. Вы моожете ознакомиться с моей точкой зрения по ссылке
Здравствуйте, Сыроежка, Вы писали:
С>Я вам больше скажу, у мен только версий алгоритма for_each около 20, если мне память не изменяет. И я не виижу причин не включить их в стандарт. напротив, в своей рпактике я всегда сталкивался с ненужными ограничениями и изобретением велосипеда.
20? В студию такое чудо!
С>Сами подумайте, например, насколько бы был полезен алгоритм for_each_if
Ни насколько. Есть Boost.Range, который все это делает в нормальном читабельном виде.
А твой for_each_if(a.begin(),a.end(),f,g) — кто из f и g фильтр, а кто — актор?
А в Boost.Range это будет for_each( a|filtered(f)|sorted(h)|reversed, g)
С>ксати сказать, вы забыли, что в стандарт включены такие примитивные алгоримты, как all_of и any_of. Так что помимо Сыроежек хватает и других программистов!
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Сыроежка, Вы писали:
С>>Я вам больше скажу, у мен только версий алгоритма for_each около 20, если мне память не изменяет. И я не виижу причин не включить их в стандарт. напротив, в своей рпактике я всегда сталкивался с ненужными ограничениями и изобретением велосипеда. J>20? В студию такое чудо!
С>>Сами подумайте, например, насколько бы был полезен алгоритм for_each_if J>Ни насколько. Есть Boost.Range, который все это делает в нормальном читабельном виде. J>А твой for_each_if(a.begin(),a.end(),f,g) — кто из f и g фильтр, а кто — актор? J>А в Boost.Range это будет for_each( a|filtered(f)|sorted(h)|reversed, g)
С>>ксати сказать, вы забыли, что в стандарт включены такие примитивные алгоримты, как all_of и any_of. Так что помимо Сыроежек хватает и других программистов!
J>Как это относится к тезису "все или ничего"?
Ну так вы, значит, сами себя обманываете! Вы говорите, что не надо расширять STL, в то время как сами активно пользуетесь его расширенями, заложенными в boost.
Я ратую за то, чтобы STL был самодостаточным.
Здравствуйте, Сыроежка, Вы писали: С>Ну так вы, значит, сами себя обманываете! Вы говорите, что не надо расширять STL, в то время как сами активно пользуетесь его расширенями, заложенными в boost. С>Я ратую за то, чтобы STL был самодостаточным.
Еше раз скажу, попробуй внимательно читай то, что тебе пишут
Здравствуйте, Сыроежка, Вы писали:
С>>>реверсировать не целиком всю структуру, а лишь некоторые ее поля I>>Это трансформация а не реверсирование.
I>>Реверсирование просто и понятно, а тебе хочется немного другого, я бы на твоем месте сменил тип контейнера и не мучился I>>
С>А реверсирование в частности и является трансформацией исходной последовательностиЮ если не используется форма с copy. Так что одного обхода не достатоноч. Что делать, если нужно изменить существующие значения?!
Все, STL головного мозга
Транформация изменяет элементы, реверсирование изменяет порядок элементов. Для тебя это одинаковые вещи, для меня нет.
Тебе не достаточно аргументов которые тебе привели, ты остался на своем мнение, на эту тему больше писать не буду.
Если ты не знаешь что нужно делать для изменения значений в контейнере, то меняй профессию. Решений твоей проблемы было приведено достаточно, в том числе тобой, переливать из пустого в порожнее мне надоело. Задачи надо решать, а не рассуждать, как бороздят корабли просторы большого театра. STL это просто инструмент, микроскопом можно заколачить гвозди, но он для другого предназначен.
Это код для размышления, можно не отвечать на сообщение, общение закончено.
typedef std::map<int, int> intmap;
intmap m;
m[0] = 0;
m[1] = 1;
m[2] = 2;
std::vector<intmap::value_type> vec;
std::transform(m.begin(), m.end(), m.rbegin(), std::back_inserter(vec), [](intmap::value_type a, intmap::value_type b)
{
return std::make_pair(a.first, b.second);
});
Re[5]: Разместить в обратном порядке отображаемые значения s
Здравствуйте, Сыроежка, Вы писали:
С>Как проще выполнить реверсию значений элементов для заданного контейнера std::map? То есть ключи остаются на месте, а меняются в обратном порядке отображаемые значения.
Предлагаю банить в /forum/cpp/* по слову клиппер в сообщении за необратимое поражение мозга оным клиппером.
Re[9]: Разместить в обратном порядке отображаемые значения s
С>Вы этот пункт покажите для автора предудыщего сообщения. Надо конструктивно обсуждать вопрос, а не заниматься поясничаньем. Иначе любую тему можно превратить в профонацию! Так что будьте объективны. Иначе как окликнется, так и аукнется!
Ты прости, пожалуйста, но твой стиль вести "конструктивное обсуждение" в лучшем случае тянет на демагогию, в худшем на графоманство.
Re: Разместить в обратном порядке отображаемые значения std:
Здравствуйте, Сыроежка, Вы писали:
С>Как проще выполнить реверсию значений элементов для заданного контейнера std::map? То есть ключи остаются на месте, а меняются в обратном порядке отображаемые значения.
std::map хранит пары значений ключей, как элемент. Но можно выкрутиться использовав "iterator adaptor" который ходит по мутабельным значениям и применить стандартный reverse.
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[18]: Разместить в обратном порядке отображаемые значения
On 01/12/2012 10:27 AM, Centaur wrote:
> И тем не менее, это не отменяет того, что перестановка значений при сохранении > ключей осмысленна только в узком частном случае, когда ключи образуют > непрерывный отрезок натурального ряда.
Да она просто на фиг никому не нужна, потому как ключ -- это часть значения
обычно. Чтоб ключ записи не лежал в записи -- это надо что-то такое придумать ...