С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/43: Рейтинг темы: голосов - 43, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 04.12.2016
Сообщений: 43
1

Опытным программистам С++

25.01.2018, 16:56. Показов 7778. Ответов 254
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, я начал изучать С++. Есть определенный план обучения. Например: сначала изучить синтаксис, принцип ООП, контейнеры STL, стандарты С++11/C++14. Вопрос звучит так: что можно еще добавить в список для изучения? Я еще не определился в какой сфере хочу использовать язык, что нужно знать вообще не привязанная к определенной области?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2018, 16:56
Ответы с готовыми решениями:

вопрос к опытным программистам
напишите пожалуйста, как часто вам приходилось или приходится использовать для обработки ошибок...

Вопрос к опытным програмистам
Ситуация такова, начинаю учить программирование в целом ну и Си++ в частности, как показало...

Посмотрите опытным взглядом
Задание Дано натуральное число n. Сформировать целочисленный массив A(2n), элементами которого...

Вопрос к опытным раскрутчикам.
Два месяца назад заказал раскрутку своего сайта. Задача - 100 уникальных посетителей в сутки. Из...

254
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.01.2018, 10:19 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Кстати так о птичках весь ранж чекинг нужен только для того чтобы отловить ошибки вычисления индексации в дебаге.
В дебаге можно сделать итераторы хранящие ссылку и на элемент, и на его контейнер. После чего прямо в эти итераторы и пихать проверку на "это итераторы от разных контейнеров". Хотя да, если в релизе оставить эти ранж-чеки, большого вреда не будет. Там работа с динамической памятью куда больше съест.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
фигушки оно в stl буде. копирование с вектора в список и из списка в вектор несовместимы и фиг они это разрулят без отой порнографии под названием algorithm пока ООП не освоят.
С чего им вдруг быть несовместимыми? Другой вопрос что они даже splice для map никак не сделают.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct AdavncedVector:std::vector<int>
{
    template<typename T>
    void insert_back(T&src,std::size_t start,std::size_t finish){
        insert(end(),std::next(src.begin(),start),std::next(src.begin(),finish));
    }
};
 
int main()
{
    AdavncedVector vector;
    std::list<int> list={1,2,3,4,5};
    vector.insert_back(list,1,3);
    for(auto&value:vector)
        std::cout<<value<<std::endl;
    return 0;
}
0
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.01.2018, 10:31 22
Цитата Сообщение от Renji Посмотреть сообщение
С чего им вдруг быть несовместимыми? Другой вопрос что они даже splice для map никак не сделают.
Потеря эффективности причем очень крутая для вектора.Вектор в вектор иногда можно копировать через memmove а то и memcpy а со списком это исключено. При этом пользовать вектор для чего то большего чем массивы фундаментальных типов или простеньких структур ну в общем себе дороже в плане гемора/количества кода а как результат и надежности.

Добавлено через 4 минуты
Цитата Сообщение от Renji Посмотреть сообщение
После чего прямо в эти итераторы и пихать проверку на "это итераторы от разных контейнеров"
Экскепшин вылетевший в продакшине и сталь все равно польется на голову горе-разраба. Чтобы это исключить пихать итераторы в специальный класс диапазона должен исключительно сам контейнер вместе с ссылкой на себя любимого.
0
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,933
Записей в блоге: 1
28.01.2018, 10:34 23
Renji,
Другой вопрос что они даже splice для map никак не сделают.
http://en.cppreference.com/w/c... ap/extract
http://en.cppreference.com/w/c... /map/merge
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.01.2018, 10:39 24
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Потеря эффективности причем очень крутая для вектора.Вектор в вектор иногда можно копировать через memmove а то и memcpy а со списком это исключено.
Никакой потери эффективности.
1) Для вектор в вектор одна версия insert, для все остальное в вектор - другая.
2) Алгоритм копирования вектор в вектор зависит от значения std::is_trivially_copyable<value_type>::value. Если true - гоняем memcpy.
Цитата Сообщение от Croessmah Посмотреть сообщение
http://en.cppreference.com/w/cpp/container/map/extract
http://en.cppreference.com/w/c... /map/merge
Хм, в 17 стандарте сделали наконец. Не знал, спасибо.
0
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.01.2018, 10:52 25
Цитата Сообщение от Renji Посмотреть сообщение
Для вектор в вектор одна версия insert, для все остальное в вектор - другая.
Ну и т.д. Возникает вопрос - и на кой тогда нужно было эту порнографию с algorithm городить если все равно придется писать разные версии для каждого случая? Cделали бы методами/операторами все было бы гораздо безопаснее проще и читабельнее и рэнджи и степы реверсы все остальное, в том числе и код самих контейнеров на порядок компактней. НО разрабы STL ООП не осилили.
Цитата Сообщение от Renji Посмотреть сообщение
Алгоритм копирования вектор в вектор зависит от значения std::is_trivially_copyable<value_type>::value. Если true - гоняем memcpy.
Это пока они в оперативе живут. Когда они могут и в оперативе и в GPU жить там гораздо веселее набор кейсов. STL вектору это правда не грозит. Там аллокаторами не отделаешься.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.01.2018, 10:58 26
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну и т.д. Возникает вопрос - и на кой тогда нужно было эту порнографию с algorithm городить если все равно придется писать разные версии для каждого случая?
Наверно, потому что дядька в Киеве. Какое отношение <algorithm> имеет к вставке в вектора? Там лежит std::lower_bound, который может вообще к сишным массивам применяться.

А писать разные версии insert придется разработчикам вектора. Для пользователя же вектора все это абсолютно прозрачно, из-за особой магии "перегрузка". Чай не Си, где для каждой новой версии функции, нужно новое имя сочинять.
0
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.01.2018, 11:10 27
Цитата Сообщение от Renji Посмотреть сообщение
Какое отношение <algorithm> имеет к вставке в вектора?
Имеет к копированию удалению поиску и т.д. При чем эта штука еще и кривая шо гипоциклоида. Неужели так трудно было сделать чтобы тот же remove_if последний элемент тоже обрабатывал?
Цитата Сообщение от Renji Посмотреть сообщение
Для пользователя же вектора все это абсолютно прозрачно,
При этом в коде который эту порнографию пользует за оными перегруженными вызовами алгоритма не видно. слишком дофига ненужных имен одного и того же контейнера и слов begin end и фактически арифметики указателей если индексы пользуются. Попробуйте как так для прикола средствами stl к примеру матрицу транспонировать или пройтись по ее главной или побочной диагонали.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.01.2018, 11:18 28
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Неужели так трудно было сделать чтобы тот же remove_if последний элемент тоже обрабатывал?
У меня обрабатывает.
C++
1
2
3
4
    int array[]={1,2,3,4};
    int*end=std::remove_if(array,array+4,[](int value){return value&1;});
    for(int*pos=array;pos<end;++pos)
        std::cout<<*pos<<std::endl;
Выдает 2 4.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Попробуйте как так для прикола средствами stl к примеру матрицу транспонировать или пройтись по ее главной или побочной диагонали.
Средства STL не поддерживают двумерных массивов. Эрзац "вектор векторов" в расчет не берем.
0
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.01.2018, 18:32 29
Цитата Сообщение от Renji Посмотреть сообщение
Средства STL не поддерживают двумерных массивов. Эрзац "вектор векторов" в расчет не берем.
Да они толком вообще нифига не поддерживают. даже банальные циклические буфера и сегментированные масиввы.
Цитата Сообщение от Renji Посмотреть сообщение
У меня обрабатывает.
Это unsafe в квадрате. Во первых потому что индексация заменена фактически арифметикой указателей а в главных потому что за всей этой мышиной возней алгоритм теряется.
Во всех годных для промышленного применения библиотеках это делается вот так:
C++
1
2
3
4
Container.Remove(Needle); // первое вхождение
Container.RemoveAll(Needle); // все вхождения
Container.Remove([](type value){return // сравнение}); // первое вхождение
Container.RemoveAll([](type value){return // сравнение}); // первое вхождение
А при прямых руках тоже самое еще и с поддержкой диапазонов и реверсов. При этом реализация с пользованием навигаторов (класс который хранит диапазон/шаг//направление) на порядок проще и компактнее чем STL что тоже говорит ни разу ни в пользу надежности STL. Потому что превосходит STL в плане концепции и абстракции а соответственно дает и возможности к примеру разделения прав доступа которых в STL нет. Например из закрытой секции использующего класса контейнер доступен для полной модификации, а из публичной части только удаление и/или добавление элементов.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.01.2018, 20:41 30
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Container.Remove(Needle)
Вы как собираетесь прикрутить это ".Remove" к сишному массиву, с которым removeIf также работает? А в векторах то да, отдельный метод removeIf адаптированный к особенностям вектора не помешал бы.
0
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.01.2018, 20:45 31
Цитата Сообщение от Renji Посмотреть сообщение
Вы как собираетесь прикрутить это ".Remove" к сишному массиву, с которым removeIf также работает? А в векторах то да, отдельный метод removeIf адаптированный к особенностям вектора не помешал бы.
А я и не собираюсь его к нему прикручивать. А если такой анахронизм и понадобится то к нему прикрутится соответствующий навигатор а не черти что.
0
1682 / 1095 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
28.01.2018, 21:03 32
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Начнем со смартпоинтерров. Что будет со смартпоинтером если объект на который он ссылается сделает delete this?
По такой логике и циклы unsafe. Вот пишу я такой код.
C++
1
2
3
int main() {
   while (1);
}
Кто виноват? Конечно же С++! Ну или компилятор! Да кто угодно, кроме меня!
1
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.01.2018, 21:10 33
Цитата Сообщение от Новичок Посмотреть сообщение
Да кто угодно, кроме меня!
Если смартпоинтеры библиотеки не поддерживают самоудаление или стороннее принудительное удаление объектов то это просто негодная для подавляющего большинства промышленных задач библиотека. Если архитектура библиотека позволяет накосячить (к примеру по опечатке) там где другие библиотеки так накосячить не дадут - то это унсафе библиотека непригодная для промышленного применения. Если пользование библиотеки заставляет писать код затрудняющий восприятие алгоритма - о это опять же унсафе библиотека не годная для промышленного применения. А вообще откройте исходники STL. Малочитабельный говнокод который унсафе по определению.
0
1682 / 1095 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
28.01.2018, 21:11 34
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Croessmah,
Вам не кажется что к примеру вот такой интерфейс будет гораздо читабельнее и безопасней
Вас зациклило на одной библиотеке и вы в сторону другой даже смотреть не хотите. У меня когда-то была похожая фигня, я не хотел смотреть ни на какие языки программирования кроме Паскаля(ибо его первым изучал). В STL конечно нет сильной защиты от дурака, но это сделано для скорости. Да и вообще нужно очень постараться чтоб например в алгоритм передать итераторы из разных контейнеров.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.01.2018, 21:18 35
Цитата Сообщение от Новичок Посмотреть сообщение
В STL конечно нет сильной защиты от дурака, но это сделано для скорости.
Защита от дурака то бог с ней. Но вот конструкции типа vector1.insert(vector1.end(),vector2.begin(),vector2.end()) это действительно форменное издевательство.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Если смартпоинтеры библиотеки не поддерживают самоудаление или стороннее принудительное удаление объектов то это просто негодная для подавляющего большинства промышленных задач библиотека.
Чтоб они это поддерживали, нужно чтобы и самоудаляющийся объект поддерживал смартпоинтеры. А у нас типа универсализм, в смартпоинтер должно пихаться все, а не только потомки гипотетического STLObject.
0
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.01.2018, 21:19 36
Цитата Сообщение от Новичок Посмотреть сообщение
Да и вообще нужно очень постараться чтоб например в алгоритм передать итераторы из разных контейнеров.
Неужели?
C++
1
std::remove_if(a1,s1+4,[](int value){return value&1;}); // запросто - a и s на клавиатуре рядом.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.01.2018, 21:20 37
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
запросто - a и s на клавиатуре рядом.
Вот именно поэтому и надо давать переменным имена более осмысленные чем a1.
0
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.01.2018, 21:54 38
Цитата Сообщение от Renji Посмотреть сообщение
А у нас типа универсализм,
в STL не универсализм а год-обджекты ни пригодные вообще ни к чему.
Цитата Сообщение от Renji Посмотреть сообщение
в смартпоинтер должно пихаться все, а не только потомки гипотетического STLObject.
если есть make_shared и т.п то никаких проблем чтобы создавать с его помощью потомока аки STLObject так и того что в него пихается вообще нет.
Но это будет реально годобджект.
Проще и надежнее сделать отдельные варианты контейнеров и указатели для хранения именно указателей на смарт-объекты а не пихать shared а тем более weak в вектор и тп

Добавлено через 53 секунды
Цитата Сообщение от Renji Посмотреть сообщение
Вот именно поэтому и надо давать переменным имена более осмысленные чем a1.
Единичку с двойкой все равно перепутать и не заметиь в каше запросто. Поэтому нужно библиотекам интерфейсы осмысленные делать а не ФП-говноляпством заниматься.

Добавлено через 3 минуты
Цитата Сообщение от Новичок Посмотреть сообщение
Вас зациклило на одной библиотеке и вы в сторону другой даже смотреть не хотите.
А зачем мне даунгрейдится с моей библиотеки на какой то лисопет криворуких которые базовых принципов ООП и надежности софта не осилили?
Как думаете по какой причине Пентагон послал Степанова подальше с его идеями прикрутить STL к АДА? Я так понимаю по той же причине его и Страуструп послал и как то С++ 15 лет без этого лисапета жили.

Добавлено через 11 минут
Цитата Сообщение от Renji Посмотреть сообщение
Вот именно поэтому и надо давать переменным имена более осмысленные чем a1.
и тогда моментально возникнет проблема с читабельностю при таком интерфейсе

Добавлено через 11 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
к примеру от того чтобы забыть вызвать деструктор никто не застрахован...
Вот для этого в С++ и есть delete который от этого страхует. Не нравится из коробки - ничто не мешает сделать самому. Такой всегда был принцип плюсов. Но как бы он от соблюдения контрактов библиотечных/встроенных средств использующий их код этот принцип не освобождает. Но если искоробочные библотечные средства урезают возможности искоробочных языковых средств- то коммитет языком ошибся. пусть идут яву стандартизировать а не С++ поганить. Лучше бы синтаксическими апгрейдами занялись которые у всех производителей давно есть но у всех по разному - свойствами, RTTI, делегатами и т.д. без чего современная разработка немыслима, а не стандартизацией лаб уровня первого курса.
0
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
28.01.2018, 21:59 39
От ошибок/опечаток мы люди не застрахованы.
В STL думаю проверки на safe обработку данных не сделаны спецом, что бы не было оверхеда из за проверок.
А там если программисту нужны доп. проверки можно написать обертку на свой лад.
Это более гибкое решение. Если бы например там было много проверок, то с++ угодил бы вам но не угодил бы тем для кого критична даже 1 лишняя инструкция, и таким разработчикам пришлось бы писать свой STL заново.
Что проще, написать простую обертку добавив пару проверок или заново написать свой мап?

в данном случае за вас просто реализовали базовые операции, стараясь как можно меньше самовольничать с целью минимизировать оверхед, а там уже смотрите сами, если надо пишите свои обертки либо вообще обходите стороной STL.
Думаю не нужно рассматривать С++ ка язык который должен всем угодить. Тогда С++ перестанет быть С++'ом
1
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.01.2018, 22:06 40
Цитата Сообщение от Undisputed Посмотреть сообщение
Если бы например там было много проверок, то с++ угодил бы вам но не угодил бы тем для кого критична даже 1 лишняя инструкция, и таким разработчикам пришлось бы писать свой STL заново.
Что проще, написать простую обертку добавив пару проверок или заново написать свой мап?
Дык вопрос что невозможность накосячить обеспечивается более другой архитектурой и интерфйесом исключающим возможности накосячить а не проверками. При этом надежность софта зависит от читабельности кода. Интерфейс STL снижает читабельность соответсвенно ему место в топке

Добавлено через 2 минуты
Цитата Сообщение от Undisputed Посмотреть сообщение
Думаю не нужно рассматривать С++ ка язык который должен всем угодить. Тогда С++ перестанет быть С++'ом
Для ого чтобы С++ остался С++ нужно не забывать что в С++ кроме STL существует еще и С++.
Т.е. прекратить навязывать а тем более называть частью языка кривой лисопет созданный людьми которые не осилили ООП, и заняться стандартизацие средств которые стали насущной необходимостью еже в середине 90-х вместе с апгрейдом мэйнстрим пардигмы с ООП до КОП.
0
28.01.2018, 22:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.01.2018, 22:06
Помогаю со студенческими работами здесь

вопрос к опытным програмистам
вопрос такого рода - за сколько вы делаете сайт и какими методами 1. Сайт визитка 2. Сайт Блог...

Вопрос к опытным гуру
В общем краткая история проблемы. Есть сайт. Сайту 3 года примерно. Коммерческий проект, сделанный...

Взываю к опытным php-шникам
Заранее прошу прощения если пишу не в той теме. В общем проблема такая. Есть галерея: ...

Нужен совет опытным верстальщиков ?
Используете ли вы повседневной верстке, в CSS такие свойства CSS3, как transform, transition,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru