Обновить
283.93

C++ *

Типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Базовый набор для решения задач на LeetCode/Codeforces, ч.4 Функциональные объекты C++

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели9.3K

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

На LeetCode вам довольно часто придется удалять, сортировать и разбивать контейнер на несколько более мелких - функциональные объекты помогут вам быстро решить задачу и не тратить время на написание велосипеда, который вероятнее всего будет медленнее и длиннее чем ваш вариант. Встроенные предикаты - это простые идеи решающие половину вашей головной боли при написании алгоритмов.

Читать далее

PVS-Studio vs CodeLite: битва за идеальный код

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели6K

Как улучшить качество и надёжность кодовой базы? Один из ответов на этот вопрос — использование статического анализа. В данной статье мы исследуем, как эта методология может улучшить качество кодовой базы на примере проекта CodeLite.

Читать далее

Пять продвинутых техник инициализации в C++: От reserve() до piecewise_construct

Время на прочтение9 мин
Охват и читатели17K

От операций с динамическими контейнерами до констант времени компиляции — C++ предлагает много интересных техник (как в этом знаменитом меме :)). В этой статье мы рассмотрим несколько продвинутых методов инициализации: от reserve() и emplace_back для контейнеров, до piecewise_construct и forward_as_tuple для кортежей. Благодаря этим техникам мы можем уменьшить количество временных объектов и более эффективно создавать переменные.

Давайте приступим!

Читать далее

Запускаем матричный принтер от старого банковского терминала

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели7.3K
Приветствую всех!

Не так давно я уже рассказывал про то, какими были принтеры начала эпохи термопечати. И в той статье я упомянул, что подобные устройства использовались совместно с платёжными терминалами VeriFone.

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



Итак, в сегодняшней статье поговорим о том, как устроен и работает такой принтер. Разберёмся, как подключить его к обычному компьютеру. Традиционно будет много интересного.
Читать дальше →

Распространённые паттерны опечаток при программировании

Уровень сложностиПростой
Время на прочтение20 мин
Охват и читатели15K

Распространённые паттерны опечаток при программировании


Есть бесконечное количество способов ошибиться при написании кода. Однако иногда можно заметить явные интересные закономерности, как и где ошибаются программисты. Поговорим о коде, который "притягивает" опечатки.


На чём основаны наблюдения


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


Рассматривая все эти ошибки, я постепенно замечаю различные повторяющиеся паттерны опечаток. За редким исключением они не зависят от языка программирования. По крайней мере, они одновременно свойственны коду, написанному на C, C++, C#, Java. В этой статье я опишу 7 паттернов, которые заметил к настоящему моменту:


  1. Эффект последней строки.
  2. Злополучная функция memset.
  3. Неверные функции сравнения.
  4. Неверные функции копирования.
  5. Ошибки работы с датами и временем.
  6. Несчастливые числа: 0, 1, 2.
  7. Ошибка на единицу (off-by-one error).

Заметность закономерностей в ошибках свидетельствует о том, что они крайне распространены. Полезно знать о них, чтобы избегать написания потенциально опасного кода или более эффективно находить их в процессе обзоров кода. Другим словами, вы узнаете, какой код притягивает ошибки, и будете более внимательно его проверять. Конечно, PVS-Studio способен выявить многие подобные ошибки, но не все. Поэтому дополнительное внимание не повредит.

Читать дальше →

Smart-contract developer Road Map

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели12K

Прочитав эту статью до конца вы поймете какими навыками вам нужно обладать для того, что бы стать smart-contract разработчиком!

В конце статьи прикреплен Solidity developer roadmap.

Читать далее...

Быстрый двоичный поиск без ветвления

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели23K

Мои читатели — занятые люди, поэтому сразу перейду к делу. Вот она, самая быстрая обобщённая (и простая) реализация двоичного поиска на C++:

template <class ForwardIt, class T, class Compare>
constexpr ForwardIt sb_lower_bound(
      ForwardIt first, ForwardIt last, const T& value, Compare comp) {
   auto length = last - first;
   while (length > 0) {
      auto rem = length % 2;
      length /= 2;
      if (comp(first[length], value)) {
         first += length + rem;
      }
   }
   return first;
}

Тот же интерфейс функции, что и у std::lower_bound, но вдвое быстрее и короче. «Без ветвления», потому что if компилируется в команду условной передачи, а не в ветвление/условный переход. Ближе к концу статьи мы изучим опции компилятора и даже более быстрые версии полностью без ветвления. Для понимания этой статьи не нужны особые знания в C++. Достаточно понимать, что итераторы (first и last) по сути являются указателями на элементы массива, хотя могут указывать на один элемент дальше, чем последний элемент массива. Можете не обращать внимания на template, class, constexpr и &. Вот если бы существовал быстрый и чистый язык, работающий на уровне железа...1 2
Читать дальше →

Книги по C++, которые можно рекомендовать разработчикам в 2023 году

Время на прочтение4 мин
Охват и читатели123K

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

Читать далее

Базовый набор для решения задач на LeetCode/Codeforces, ч.3 Адаптивные Контейнеры C++

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели5.7K

Это будет наиболее короткая и понятная статья, на LeetCode довольно много задач, которые гораздо проще и лучше получится решать с использованием обоих этих классов, не уверен что обоих сразу, но по-отдельности получается отлично.

Статья получится очень короткой, если я просто перечислю pop, top, front поэтому добавлю по-небольшому разбору некоторых задач с LeetCode.

Почему адаптивные контейнеры?
Дело в том, что любой из этих классов довольно просто повторить при помощи любого последовательного(VECTOR, LIST, DEQUE). Из этого и термин адаптивный контейнер - он подстраивает под себя некоторый функционал классов контейнеров, что в определенной комбинации решает задачи максимально красиво и быстро.

Читать далее

Базовый набор для решения задач на LeetCode/Codeforces, ч.2 Ассоциативные Контейнеры C++

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели11K

Начиная разбираться в ассоциативных контейнерах нужно обговорить, что вообще такое ассоциативность - если вы в детстве играли в "Ассоциации", то для вас все почти очевидно, ведь для каждого объекта обговариваемого в периоде игры - нужно найти что-то связанное с этим объектом.

Читать далее

Неопределённое поведение в C/C++ и приёмы против лома

Время на прочтение16 мин
Охват и читатели12K

Некоторое время назад в Интернете ходила статья о неопределённом поведении, просто бесившая коренную аудиторию Rust. Завсегдатаи С и C++ в ответ только бурчали, что кто-то просто не понимает Всех Тонкостей и Нюансов Их Светлейшего Языка. Как обычно, пришло время и мне постараться изо всех сил и вставить мои пять копеек в эту застарелую дискуссию.

Готовьтесь поговорить об Основной Проблеме языков C и C++, а также о Принципе Лома.

Читать далее

Базовый набор для решения задач на LeetCode/Codeforces, ч.1

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели20K

«Время — это единственная вещь, которую все хотят иметь, но которую нельзя купить или продлить» — Харви Маккей

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

Читать далее

Как мы за один день наняли много C++ разработчиков: рекомендации МойОфис для нанимающих менеджеров

Время на прочтение7 мин
Охват и читатели7.4K

Уже как минимум пару лет формат быстрого найма сотрудников, или One day offer, набирает популярность в ИТ-компаниях. У него есть неоспоримые плюсы для всех участников: всего за один день работодатель закрывает вакансию (а то и несколько), а кандидат получает ответ (и, возможно, предложение о работе). 17 июня этого года мы провели ряд онлайн-собеседований c C++ разработчиками уровня middle и senior — и в итоге пополнили команды сразу нескольких отделов. В этом посте делимся ценными наблюдениями по итогам проекта и важными инсайтами — если вы нанимающий менеджер, вы точно найдете здесь немало полезного.

Читать далее

Ближайшие события

C++ Дайджест №1 (7 августа 2023 – 20 августа 2023)

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели4.8K

Привет, Хабр! Сегодня я хочу вам представить подборку интересных новостей и материалов из мира C++ за последние две недели.

Приятного чтения!

Читать далее

Муравьиный алгоритм | Задача коммивояжёра

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели32K


Всем привет! Меня зовут Нурислам aka tonitaga, данная статья является продолжением статьи Базовые алгоритмы на графах.

  • Задача коммивояжёра — это классическая комбинаторная задача, в которой необходимо найти самый короткий маршрут, проходящий через все заданные города, и вернуться в начальную точку. Путешественник должен посетить каждый город один раз, при этом общая длина пути должна быть минимальной.

  • Задача коммивояжера является NP-полной, то есть нет известного эффективного алгоритма для ее решения, который работал бы для всех вариантов. Вместо этого применяются различные приближенные алгоритмы. В данной статье мы рассмотрим Муравьиный алгоритм и его реализацию на С++
Читать дальше →

Недостатки корутин в C++

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели11K

Эта статья написана с целью подчеркнуть некоторые риски, связанные с переносом базы кода на использование корутин. Я считаю, что продолжающееся неграмотное использование этой функциональности может привести к уменьшению безопасности и замедлению программ.

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

Подводные камни C++. Решаем загадки неопределённого поведения, ч. 2

Время на прочтение9 мин
Охват и читатели9.7K

Мы продолжаем цикл статей, посвящённых теме undefined behavior. Ранее мы исследовали предпосылки неопределённого поведения в C++, предоставили формальные определения и рассмотрели несколько примеров. Сегодня углубимся в проблему: сосредоточимся на случаях UB при многопоточности и неправильном использовании move-семантики.

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

Читать далее

Первые новинки C++26: итоги летней встречи ISO

Время на прочтение11 мин
Охват и читатели31K

На недавней встрече комитет C++ активно взялся за C++26. Уже есть первые новинки, которые нас будут ждать в готовящемся стандарте C++:

  • улучшенный static_assert,
  • переменная _,
  • оптимизация и улучшение для std::to_string,
  • Hazard Pointer,
  • Read-Copy-Update (так же известное как RCU),
  • native_handle(),
  • целая вереница классов *function*,
  • множество доработок по constexpr,
  • std::submdspan,
  • и прочие приятные мелочи.

Рассмотрим новинки на примерах

Как я вошёл в клуб бага 323

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели32K

Это история о баге, который бы заставил вас рвать на себе волосы. Из-за такого бага вы можете подумать: «Но это невозможно, должно быть, компилятор сломался, других вариантов нет!»

А баг компилятора — это серьёзно: за двенадцать лет программирования на C++ я обнаружил (и написал отчёт) всего... об одном. И могу сказать, что перед отправкой отчёта о баге GCC, я максимально тщательно протестировал и проверил его, чтобы не выглядеть идиотом.

Впрочем, ладно, вот моя история.

Читать далее

С++: стреляем по ногам по-современному

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели13K

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

Но тяжелая поступь прогресса неостановима.

Прогресс принес нам современный С++ и вместе с ним новые, современные способы стрельбы себе по ногам - просто потому что стрелять по-ногам по-стариковски это фу.

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

По-одному из пунктов знающие люди (тм) прижали меня к стенке уничтожающим вопросом: а чего ж ты псишь на авто, мил человек?

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

И вот в доказательство своей правоты я решил нырнуть немного глубже в тему и посмотреть, как еще можно неправильно приготовить (что непременно произойдет) этот чудесный подарок миру С++.

Читать дальше

Вклад авторов