Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++

  1. C++ 더블 해싱(Double Hashing)으로 해시 테이블 구현하기: 알고리즘부터 예제 코드까지

    해시 테이블(Hash Table)은 키-값(key-value) 쌍을 저장하는 자료구조입니다. 해시 테이블은 해시 함수(Hash Function)를 사용하여 요소를 삽입하거나 검색할 배열의 인덱스를 계산합니다.더블 해싱(Double Hashing)은 개방 주소법(Open Addressing) 기반 해시 테이블에서 충돌(collision)을 해결하는 대표적인 기법입니다. 충돌이 발생하면 두 번째 해시 함수를 사용해 다음 탐색 위치의 이동 간격(step size)을 결정합니다. 이 방식은 선형 조사나 이차 조사에서 발생하는 클러스터링(c

  2. C++로 구현하는 롤링 해시(Rolling Hash) 프로그램

    롤링 해시(Rolling Hash)는 입력값 위를 이동하는 윈도우(window) 단위로 데이터를 해싱하는 해시 함수입니다. 윈도우가 한 칸씩 밀릴 때마다 전체를 다시 계산하지 않고 이전 해시 값을 재활용해 빠르게 갱신할 수 있다는 점이 가장 큰 특징입니다.롤링 해시의 대표적인 응용 사례는 라빈-카프(Rabin-Karp) 문자열 검색 알고리즘입니다. Rabin과 Karp가 제안한 롤링 해시 함수는 문자열을 하나의 정수 값으로 변환하며, 이 정수 값은 곧 해당 문자열의 수치적 표현이 됩니다.라빈-카프 알고리즘은 곱셈과 덧셈만으로 구성된

  3. C++로 선형 탐사(Linear Probing) 기반 해시 테이블 구현하기

    해시 테이블(Hash Table)은 키-값(key-value) 쌍을 저장하기 위해 사용되는 대표적인 자료구조입니다. 해시 테이블은 해시 함수(Hash Function)를 이용해 배열 내의 인덱스를 계산하며, 해당 인덱스 위치에 요소를 삽입하거나 검색하게 됩니다.선형 탐사(Linear Probing)란?선형 탐사는 개방 주소법(Open Addressing) 방식의 해시 테이블에서 충돌(Collision)을 해결하는 기법입니다. 이 방식에서는 해시 테이블의 각 셀이 하나의 키-값 쌍만을 저장합니다.새로운 키를 삽입하려고 할 때, 해시

  4. C++ 변환 연산자(Conversion Operator)란? 개념부터 예제까지

    이 글에서는 C++의 변환 연산자(Conversion Operator)가 무엇인지, 그리고 어떻게 활용하는지 살펴보겠습니다.C++은 객체 지향 프로그래밍을 지원하기 때문에 현실 세계의 사물을 하나의 구체 타입(concrete type)으로 만들어 클래스로 표현할 수 있습니다. 그런데 프로그래밍을 하다 보면 특정 클래스의 객체를 다른 타입의 객체나 int, double 같은 기본 자료형(primitive data type)으로 변환해야 하는 경우가 종종 발생합니다.이럴 때 사용하는 것이 바로 변환 연산자입니다. 변환 연산자는 클래스

  5. C++ 배치 new(Placement New) 연산자의 이해와 활용 방법

    이 글에서는 C++의 배치 new(placement new) 연산자가 무엇인지, 그리고 일반적인 new 연산자와 어떻게 다른지 자세히 알아보겠습니다.배치 new란 무엇인가?배치 new는 new 연산자의 또 다른 변형 형태입니다. 먼저 일반적인 new 연산자의 동작을 살펴보면, 다음 두 가지 작업을 수행합니다.메모리를 할당합니다.할당된 메모리에 객체를 생성(construct)합니다.일반 new 연산자는 힙(heap) 영역에 메모리를 할당하고 그곳에 객체를 생성합니다. 반면 배치 new 연산자는 이미 존재하는 특정 주소에 객체를 생성한

  6. C++ 배치 new(Placement New) 연산자의 개념과 활용법

    이번 글에서는 C++의 배치 new(Placement New) 연산자에 대해 알아보겠습니다. 배치 new는 일반적인 new 연산자의 변형된 형태입니다.일반 new와 배치 new의 차이점먼저 일반적인 new 연산자가 수행하는 두 가지 작업을 살펴봅시다.메모리 할당: 힙(heap) 영역에 필요한 메모리를 확보합니다.객체 생성: 할당된 메모리 공간에 객체를 생성(construct)합니다.반면 배치 new는 메모리를 새로 할당하지 않고, 개발자가 지정한 주소에 직접 객체를 생성합니다.메모리 해제 관련 주의사항일반 new로 할당한 메모리는

  7. 힙 오버플로(Heap Overflow)와 스택 오버플로(Stack Overflow) 완벽 정리

    힙 오버플로(Heap Overflow)힙(Heap)은 프로세스 메모리 영역 중 하나로, 동적 변수(dynamic variables)를 저장하는 데 사용됩니다. C 언어에서는 malloc(), calloc(), realloc()과 같은 표준 라이브러리 함수를 통해 힙 영역에 메모리를 동적으로 할당할 수 있습니다.힙 오버플로는 다음과 같은 상황에서 발생합니다.1. 과도한 크기의 동적 메모리 할당필요한 양보다 훨씬 큰 메모리를 한 번에 동적 할당하려고 하면 힙 영역이 가용 메모리를 초과하게 되어 오버플로가 발생합니다.int main()

  8. C++ 가변 인수(Variable Arguments) 완벽 정리: stdarg.h 활용 방법

    프로그래밍을 하다 보면 함수에 전달되는 인수의 개수가 미리 정해져 있지 않고, 상황에 따라 유동적으로 변해야 하는 경우가 있습니다. 예를 들어 어떤 함수는 인수를 2개 받아야 하고, 또 다른 호출에서는 같은 함수에 5개의 인수를 넘겨야 할 수도 있죠.C/C++ 언어는 이러한 요구를 해결하기 위해 가변 인수(variable arguments) 기능을 제공합니다. 이를 활용하면 개발자가 필요에 따라 임의 개수의 매개변수를 받을 수 있는 함수를 직접 정의할 수 있습니다.가변 인수 함수의 기본 구조가변 인수를 지원하는 함수는 다음과 같은

  9. C++로 2차 탐사(Quadratic Probing) 기반 해시 테이블 구현하기

    해시 테이블(Hash Table)은 키-값 쌍을 저장하는 데 사용되는 대표적인 자료구조입니다. 해시 함수(Hash Function)는 삽입하거나 검색할 요소가 위치할 배열의 인덱스를 계산하는 역할을 담당합니다.2차 탐사(Quadratic Probing)는 개방 주소법(Open Addressing) 방식의 해시 테이블에서 충돌(Collision)을 해결하는 기법 중 하나입니다. 이 방식은 원래의 해시 인덱스에 임의의 2차 다항식 값을 순차적으로 더해가며 빈 슬롯을 찾을 때까지 탐색을 진행합니다.이 글에서는 C++를 활용해 2차 탐사

  10. C++ 생성자에서 예외 발생시키기: 핵심 개념과 예제

    C++에서는 생성자 내부에서도 예외(exception)를 던질 수 있습니다. 이 글에서는 C++ 생성자에서 예외를 발생시키는 방법을 의사코드와 실제 예제를 통해 살펴보겠습니다. 핵심 개념 생성자는 반환값이 없기 때문에, 객체 생성 과정에서 오류가 발생했을 때 예외를 던지는 것이 가장 일반적인 오류 보고 방식입니다. 여기서 중요한 규칙이 하나 있는데, 생성자에서 예외가 던져지면 해당 객체의 소멸자는 호출되지 않습니다. 반면, 이미 완전히 생성된 다른 객체들은 스택 풀기(stack unwinding) 과정에서 자동으로 소멸됩니다. 알고

  11. C++로 선형 탐사(Linear Probing) 기반 오픈 어드레싱 해시 테이블 직접 구현하기

    해시 테이블(Hash Table)은 키-값(Key-Value) 쌍을 저장하는 자료구조입니다. 해시 테이블은 해시 함수(Hash Function)를 사용하여 배열 내 인덱스를 계산하고, 해당 위치에 요소를 삽입하거나 검색하게 됩니다.선형 탐사(Linear Probing)는 오픈 어드레싱(Open Addressing) 방식의 해시 테이블에서 충돌(Collision)을 해결하는 기법입니다. 이 방식에서는 해시 테이블의 각 셀이 하나의 키-값 쌍만 저장합니다. 새로운 키를 매핑할 때 해당 셀이 이미 다른 키로 점유되어 있다면 충돌이 발생하

  12. C++에서 ++*ptr, *ptr++, *++ptr의 차이점 — 연산자 우선순위 완벽 이해하기

    포인터와 증가 연산자의 조합 C++에서 *ptr++, *++ptr, ++*ptr은 언뜻 비슷해 보이지만, 각각 완전히 다른 의미와 결과를 가집니다. 이 차이를 제대로 이해하려면 후위 증가 연산자(postfix ++)와 전위 증가 연산자(prefix ++)의 우선순위를 먼저 알아야 합니다. 연산자 우선순위를 정리하면 다음과 같습니다. 후위 ++ 또는 --: 가장 높은 우선순위를 가지며, 전위 ++와 역참조 연산자(*)보다 우선 적용됩니다. 전위 ++ 또는 --: 역참조 연산자(*)보다 높은 우선순위를 가집니다. 역참조 연산자 *:

  13. C++로 구현하는 AVL 트리: 자가 균형 이진 탐색 트리 완벽 가이드

    AVL 트리란 무엇인가?AVL 트리는 자가 균형(self-balancing) 이진 탐색 트리의 대표적인 예입니다. 모든 노드에서 왼쪽 서브트리와 오른쪽 서브트리의 높이 차이가 절대 1을 초과하지 않도록 스스로 균형을 유지하는 것이 특징입니다. 덕분에 트리가 한쪽으로 치우쳐 탐색 성능이 최악으로(O(n)) 떨어지는 것을 방지하고, 항상 O(log n) 수준의 검색·삽입·삭제 성능을 보장할 수 있습니다.트리 회전(Tree Rotation)의 원리트리 회전은 노드 간의 정렬 순서를 그대로 유지하면서 트리의 구조만 변경하는 연산입니다. 회

  14. C++ 인라인 가상 함수(Inline Virtual Function) 완벽 이해하기

    C++에서 가상 함수(virtual function)는 기본 클래스 포인터 목록을 활용하여, 파생 클래스 객체의 실제 타입을 알지 못해도 해당 클래스의 메서드를 호출할 수 있도록 해주는 기능입니다. 가상 함수는 컴파일 시점이 아니라 런타임에 늦게 바인딩(late binding)된다는 특징이 있습니다.가상 함수와 인라인 함수의 역할가상 함수의 핵심 목적은 런타임 다형성(Runtime Polymorphism)을 구현하는 것입니다. 반면 인라인 함수(inline function)는 코드 실행 효율을 높이기 위해 사용됩니다. 인라인 함수가

  15. C++ 순수 가상 소멸자(Pure Virtual Destructor) 이해하기

    C++에서는 순수 가상 소멸자(pure virtual destructor)를 선언하는 것이 가능합니다. 다만 한 가지 중요한 규칙이 있습니다. 클래스에 순수 가상 소멸자가 포함되어 있다면, 반드시 해당 소멸자에 대한 함수 본체(function body)를 별도로 정의해 주어야 합니다.이것이 필요한 이유는 간단합니다. 파생 클래스의 객체가 소멸될 때, 기반 클래스의 소멸자도 반드시 호출되기 때문입니다. 순수 가상으로 선언된 소멸자라 하더라도 객체 소멸 과정에서 실행되어야 하므로 구현부가 존재해야 합니다.예제 코드#include <

  16. C++ 가상 함수와 순수 가상 함수의 차이점 완벽 정리

    C++에서 가상 함수(Virtual Function)와 순수 가상 함수(Pure Virtual Function)는 다형성(polymorphism)을 구현하는 핵심 도구입니다. 두 개념은 비슷해 보이지만 선언 방식과 용도, 파생 클래스에 미치는 영향에서 중요한 차이가 있습니다. 아래 표는 두 함수의 주요 차이점을 한눈에 비교한 것입니다. 가상 함수 (Virtual Function)순수 가상 함수 (Pure Virtual Function) 클래스 내부에 실제 구현(정의)을 가집니다.선언만 존재하며 별도의 구현(정의)이 없습니다.

  17. C++ 생성자·소멸자에서 가상 함수 호출이 위험한 이유와 동작 원리

    C++에서 생성자나 소멸자 안에서 가상 함수를 호출하는 것은 위험한 동작이며, 가능한 한 피해야 합니다. 그 이유는 이때 호출되는 가상 함수가 파생(Derived) 클래스에서 오버라이딩된 버전이 아니라, 기반(Base) 클래스의 버전으로 실행되기 때문입니다. 왜 기반 클래스의 함수가 호출될까? 원인은 C++의 객체 생성 순서에 있습니다. C++에서는 슈퍼클래스(기반 클래스)가 파생 클래스보다 먼저 생성됩니다. 즉, 파생 클래스 D의 객체가 만들어지려면 반드시 그 전에 기반 클래스 B가 먼저 인스턴스화되어야 합니다. B의 생성자가

  18. C++ 가상 함수에 기본 매개변수를 사용할 수 있을까요?

    네, C++의 가상 함수(virtual function)에도 기본 매개변수(디폴트 인자)를 선언할 수 있습니다. 다만 그 동작 방식에는 직관적이지 않은 부분이 있어 주의가 필요합니다. 아래 예제를 통해 자세히 살펴보겠습니다.예제 코드#include<iostream> using namespace std; class B { public: virtual void s(int a = 0) { cout << In Base \n; } }; class D : public B { public:

  19. C++로 구현하는 Bitap 알고리즘: 빠른 문자열 매칭 프로그램

    이 글에서는 문자열 매칭(String Matching)을 위한 Bitap 알고리즘을 구현하는 C++ 프로그램을 소개합니다. Bitap 알고리즘은 주어진 텍스트 안에 특정 패턴과 근사적으로 일치하는 부분 문자열이 존재하는지 판별하는 알고리즘입니다. 여기서 근사 일치는 Levenshtein 거리(편집 거리)를 기준으로 정의되며, 부분 문자열과 패턴 사이의 거리가 주어진 값 k 이내라면 두 문자열은 일치하는 것으로 간주됩니다.알고리즘은 먼저 패턴의 각 문자에 대해 하나의 비트를 담는 비트마스크(bitmask) 집합을 미리 계산합니다. 이

  20. 짧은 텍스트를 위한 문자열 검색 알고리즘 구현 C++ 프로그램

    이 C++ 프로그램에서는 텍스트(원본 문자열)와 패턴(검색할 문자열)을 입력으로 받습니다. 그다음 텍스트 안에서 패턴을 검색하여 패턴이 나타나는 모든 위치와 총 개수를 출력으로 보여줍니다. 알고리즘 Begin 문자열과 패턴을 입력으로 받습니다. 원본 배열과 복사 배열을 각각 선언합니다. 원본 문자열과 복사 문자열의 길이를 len_ori와 len_dupli에 저장합니다. 검색하려는 패턴의 위치를 찾기 위한 반복문을 수행합니다. 패턴이 발견되지 않으면 찾지 못함을 출력하고, 발견되면 검색된 패턴의

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:43/300  20-컴퓨터/Page Goto:1 37 38 39 40 41 42 43 44 45 46 47 48 49