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

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

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

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

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

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

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

254
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
28.01.2018, 22:59
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Renji Посмотреть сообщение
Потому как есть такая штука как "выравнивание".
alignof? Или я чего то не понимаю...
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.01.2018, 23:05
Цитата Сообщение от _stanislav Посмотреть сообщение
кстати, причина по которой stl не убрали из стандартной библиотеки
Причины известны. Должна быть обратная совместимость. Ну если это легаси будет там где то в отдельной папке лежать пусть себе лежит мне от этого ни холодно не жарко. А вот то что вместо внесения в язык насущных средств на уровень ядра толкают какие то библиотечные костыли вот это как раз давно пора прекращать, а то коммитетовский С++ сам рискует превратится в легаси. К примеру нативные свойства и нативные делегаты гораздо эффективнее как в плане удобства синтаксиса так и в плане отсутствия оверхеда нежели костыли на основе шаблонов. При этом многие из этих средств в компиляторах ведущих производителей живут уже более 20 лет только у всех по разному.

Добавлено через 4 минуты
Цитата Сообщение от Renji Посмотреть сообщение
И делать char знаковым или беззнаковым в зависимости от платформы, это вредительство. Хотя, это уже не вина STL.
ну там где это важно можно кастить в unsigned __int8;
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.01.2018, 23:15
Цитата Сообщение от lArtl Посмотреть сообщение
alignof? Или я чего то не понимаю...
И в итоге у нас получается монструозная конструкция вида:
C++
1
2
    std::size_t align=std::max(alignof(void*),alignof(value_type));
    std::size_t size=(sizeof(void*)*2+sizeof(value_type)+align-1)&~(align-1);
А потом оказывается что в дебаг-моде ListNode хранит не только указатели на предыдущий/следующий элемент, но и какую-то отладочную информацию. Например, указатель на родительский контейнер. И наша формула работать внезапно перестает.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
ну там где это важно можно кастить в unsigned __int8;
Так это важно везде, где с char делается что-то помимо копирования. Например, в лексикографическом сравнении utf-8 строк.
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
28.01.2018, 23:30
Цитата Сообщение от Renji Посмотреть сообщение
И в итоге у нас получается монструозная конструкция вида:
std::list отвечает требованиям Container, AllocatorAwareContainer, SequenceContainer и ReversibleContainer.
AllocatorAwareContainer - контейнером, который содержит экземпляр Allocator и использует этот экземпляр во всех своих функциях-членах для выделения и освобождения памяти, а также для создания и уничтожения объектов в этой памяти (такими объектами могут быть элементы контейнера, узлы). Тобишь он будет хранить не T, а _List_node<T>.

Добавлено через 2 минуты
Цитата Сообщение от Renji Посмотреть сообщение
Так это важно везде, где с char делается что-то помимо копирования. Например, в лексикографическом сравнении utf-8 строк.
Компилятор на этапе компиляции знает, с какими типами он будет работать.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.01.2018, 23:32
Цитата Сообщение от Renji Посмотреть сообщение
Так это важно везде, где с char делается что-то помимо копирования. Например, в лексикографическом сравнении utf-8 строк.
Оно важно разве что в табличном лексере в котором очередной поступивший на вход символ используется как индекс в массиве правил переходов.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.01.2018, 23:36
Цитата Сообщение от lArtl Посмотреть сообщение
Компилятор на этапе компиляции знает, с какими типами он будет работать.
Ага, компилятор на этапе компиляции знает что будет работать с char, как с числом со знаком. Поэтому он знает что char(128+64) (первый октет двубайтового utf-8 символа) меньше чем char(0). Тогда как для utf8 символов должно быть с точностью до наоборот.
Цитата Сообщение от lArtl Посмотреть сообщение
Тобишь он будет хранить не T, а _List_node<T>.
Я и написал формулу считающую размер List_node<T> вида:
C++
1
2
3
4
5
6
7
template<typename T>
struct List_node
{
    List_node*next;
    List_node*prev;
    T value;
};
А можно было вместо этого написать sizeof(std::list<double>::List_node) и не парить себе мозг.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
28.01.2018, 23:42
Renji,
Пишу с мобилы не удобно цитировать...
Список по определению является динамической структурой данных, что вам даст знание размера ноды на этапе компиляции, и как вы без маллока выделите память для динамической структуры данных, причём на этапе компиляции, зная просто размер этой самой ноды?

Насчёт чара в стринге, можно же передавать явно тот тип который нужно, если "зависит от реализации" не подходит под ваши требования?
Насчёт итераторов - у строк они тоже имеются а оператор [] есть не у всех просто потому что его наличие зависит от данных. Скажем в том же листе он ни к чему. А в векторе например очень даже кстати...
Всему своё место

Насчёт регулярок тут уже надо обращаться к разрабам, что бы добавили то чего нет...
В крайнем случае можно пока можно дергать для этих дел какой нибудь скриптовый язык (если сильно надо), системные вызовы ведь никто не отменял... Да, не удобно, но и не безвыходно...
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
28.01.2018, 23:51
Цитата Сообщение от Renji Посмотреть сообщение
А можно было вместо этого написать sizeof(std::list<double>::List_node) и не парить себе мозг.
std::list сделает это за вас используя rebind и вы не будете парить себе мозг о том, как там List_node устроен и не выводя при этом формулы размеров и выравнивания. И чет приведенный вами аллокатор какой то странный. Allocator
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.01.2018, 00:04
Цитата Сообщение от lArtl Посмотреть сообщение
std::list сделает это за вас используя rebind
Ну и как вы используя rebind создадите отдельный пул объектов, для каждого экземпляра списка? Вот создать пул общий для всех std::list<double> да, можно. Но если в пул лезет неизвестное число объектов, то нельзя проконтролировать и верхний лимит расходов памяти в этом пуле. И теряется смысл в подобных оптимизациях - все равно придется куда-то впихивать malloc для расширения пула.

В этом собственно и проблема STL-аллокаторов - они писались как обертка вокруг глобального malloc. На "каждый объект сидит в своей песочнице размером в сто элементов" они не рассчитывались.
Цитата Сообщение от Undisputed Посмотреть сообщение
Список по определению является динамической структурой данных, что вам даст знание размера ноды на этапе компиляции, и как вы без маллока выделите память для динамической структуры данных, причём на этапе компиляции, зная просто размер этой самой ноды?
А я заранее знаю максимальное число элементов в этой структуре. Скажем, если это список фигур на доске, то больше 64 элементов там появиться ну никак не может.

Да, в стринге теоретически можно задать тип используемого символа. Но всякие там std::to_string с подобными кастомными строками работать не умеют. И я может быть что-то пропустил, но std::basic_string::find работать с итераторами вроде бы пока не научили.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
29.01.2018, 00:26
Renji,
Вот вам ещё один вариант для аллокации, и даже с определением размера ноды на этапе компиляции:
Аллокаторы имеют шаблонный параметр T, который по идее должен быть выведен как тип ноды (если подсунуть листу свой аллокатор).
Что мешает в конструкторе аллокатора выделить память, размер которой будет равен sizeof(T) * fixed_elements_count, и при аллокации использовать выделенный буфер? Вроде то что вы хотели...

Добавлено через 1 минуту
Я конечно не проверял но вроде должно сработать
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.01.2018, 00:41
Цитата Сообщение от Undisputed Посмотреть сообщение
Что мешает в конструкторе аллокатора выделить память, размер которой будет равен sizeof(T) * fixed_elements_count, и при аллокации использовать выделенный буфер?
Мешает этот чертов rebind, позволяющий конструкции вида:
C++
1
double*array=std::allocator<void>::rebind<double>::other().allocate(10);
В этом случае аллокатор конструируется и разрушается постоянно, что делает невозможным что либо там выделять.
Впрочем, в C++17 rebind стал deprecated. Может, в C++20 эту гадость удалят окончательно.
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
29.01.2018, 00:51
Цитата Сообщение от Renji Посмотреть сообщение
Ну и как вы используя rebind создадите отдельный пул объектов, для каждого экземпляра списка?
Сделать пул свойством аллокатора?

Цитата Сообщение от Renji Посмотреть сообщение
Но если в пул лезет неизвестное число объектов, то нельзя проконтролировать и верхний лимит расходов памяти в этом пуле. И теряется смысл в подобных оптимизациях - все равно придется куда-то впихивать malloc для расширения пула.
Это не проблема stl.
Цитата Сообщение от Renji Посмотреть сообщение
Да, в стринге теоретически можно задать тип используемого символа. Но всякие там std::to_string с подобными кастомными строками работать не умеют. И я может быть что-то пропустил, но std::basic_string::find работать с итераторами вроде бы пока не научили.
std::string = std::basic_string<char>.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.01.2018, 00:57
Цитата Сообщение от lArtl Посмотреть сообщение
Сделать пул свойством аллокатора?
Того аллокатора который второй аргумент в template < class T, class Alloc = allocator<T> > class list? Так он про ListNode ничего не знает, ему T в качестве аргумента сунули.
Того аллокатора который получился от rebind? Это временный объект, который через три наносекунды помрет вместе с пулом в нем.
Цитата Сообщение от lArtl Посмотреть сообщение
Это не проблема stl.
Ага, ага. В нашей библиотеке нет нужного вам функционала? Не наши проблемы.
Но возвращаемся к исходному - для нужного функционала придется пилить свой контейнер.
Цитата Сообщение от lArtl Посмотреть сообщение
std::string = std::basic_string<char>.
А мне надо std::basic_string<unsigned char>.
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
29.01.2018, 01:30
Цитата Сообщение от Renji Посмотреть сообщение
Того аллокатора который второй аргумент в template < class T, class Alloc = allocator<T> > class list? Так он про ListNode ничего не знает, ему T в качестве аргумента сунули.
Того аллокатора который получился от rebind? Это временный объект, который через три наносекунды помрет вместе с пулом в нем.
Поэтому std::list будет хранить не allocator<T>, а тот, который мы получим от rebind.

Цитата Сообщение от Renji Посмотреть сообщение
Ага, ага. В нашей библиотеке нет нужного вам функционала? Не наши проблемы.
Но возвращаемся к исходному - для нужного функционала придется пилить свой контейнер.
Если в лоб, то сделать статический член класса равный размеру выделенной памяти в них. Причем тут stl не понимаю.

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
А мне надо std::basic_string<unsigned char>.
А что вы скажите насчет std::u16string?

Добавлено через 6 минут
А вообще работать с локалью и кодировками в stl тот еще гемор, всякие там codecvt и тд
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.01.2018, 01:48
Цитата Сообщение от lArtl Посмотреть сообщение
Поэтому std::list будет хранить не allocator<T>, а тот, который мы получим от rebind.
Где конкретно это написано? std::list::get_allocator возвращает allocator<T>, конструктор листа принимает опять же allocator<T>. Мы конечно можем прикинуть что по уму то надо хранить аллокатор полученный от rebind, но вот гарантий этого я не вижу. А раз нет гарантий, то и полагаться на такие умозаключения нельзя.
Цитата Сообщение от lArtl Посмотреть сообщение
Если в лоб, то сделать статический член класса равный размеру выделенной памяти в них. Причем тут stl не понимаю.Если в лоб, то сделать статический член класса равный размеру выделенной памяти в них. Причем тут stl не понимаю.
Статический член будет один на все экземпляры списка. А нужно чтоб каждому экземпляру свой пул.
Цитата Сообщение от lArtl Посмотреть сообщение
А что вы скажите насчет std::u16string?
Так разговор то был о char. А так да, можно просто выкинуть из программы все char и использовать wchar_t.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
29.01.2018, 01:50
Цитата Сообщение от Renji Посмотреть сообщение
Ага, ага. В нашей библиотеке нет нужного вам функционала? Не наши проблемы.
Но возвращаемся к исходному - для нужного функционала придется пилить свой контейнер.
Вот в том то и проблема. Причем она не столько в самой STL которую можно в случае необходимости просто допиливать, а в крайнем (ну или сходу) заменить на что то годное. Проблема в том что коммитет уже 20 лет 2/3 стандарта описывает инструменты точное назначение которых на этапе их псевдоуниверсальной разработки известно быть не может, но при этом неумение самостоятельно пилить такие инструменты канает на отчисление после первого семестра в любом толковом ликбезе.
А вот те средства которые нужно добавлять в ядро языка ии которые не могут быть созданы программистом в рамках решения его конкретной задачи в результате всего этого остаются за кадром.
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
29.01.2018, 02:03
Цитата Сообщение от Renji Посмотреть сообщение
Статический член будет один на все экземпляры списка. А нужно чтоб каждому экземпляру свой пул.
Имелось виду size_t, который будет показывать, сколько все аллокаторы выделили память.
Цитата Сообщение от lArtl Посмотреть сообщение
Ага, ага. В нашей библиотеке нет нужного вам функционала? Не наши проблемы.
Но возвращаемся к исходному - для нужного функционала придется пилить свой контейнер.
Еще раз, это не проблема stl. Это проблема пула, который что то там не может предсказать.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
29.01.2018, 02:05
Цитата Сообщение от Renji Посмотреть сообщение
Скажем, если это список фигур на доске, то больше 64 элементов там появиться ну никак не может.
так. а зачем там тогда вообще список если их количество заранее известно? Может вектор указателей удобнее и быстрее будет в конечном итоге?
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
29.01.2018, 02:20
Вот единственное, что аллокатор влияет на тип контейнера...
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
29.01.2018, 02:22
Цитата Сообщение от lArtl Посмотреть сообщение
Вот единственное, что аллокатор влияет на тип контейнера...
Вопрос в том что пулы константной аллокации для объектов классов давно пора иметь под капотом штатного менеджера кучи а не спорить как их прикручивать библиотечными средствами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.01.2018, 02:22
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru