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

C++

  1. C++ std::bind 함수와 플레이스홀더(Placeholder) 완벽 정리

    C++의 std::bind 함수와 플레이스홀더란? 개발을 하다 보면 기존 함수의 동작을 상황에 맞게 조정해야 할 때가 종종 있습니다. 예를 들어 특정 인수 값을 미리 고정한다거나, 함수가 호출될 때 전달되는 인수의 개수와 순서를 변경하는 작업 등이 그 예입니다. C++11에서 새롭게 도입된 std::bind 함수는 이러한 작업을 훨씬 간편하게 처리할 수 있도록 도와주는 기능입니다. std::bind를 사용하려면 <functional> 헤더 파일을 포함해야 합니다. std::bind는 플레이스홀더(placeholder)와

  2. 참조 지역성(Locality of Reference)을 활용한 검색: C++ 프로그램 구현

    참조의 지역성(locality of reference)에 기반한 검색은 메모리 접근 패턴에 따라 데이터 요소를 재배치하는 기법입니다. 이 프로그램에서는 선형 탐색(linear search) 방식으로 요소를 검색하며, 요소를 찾으면 해당 요소를 배열의 맨 앞으로 이동시킵니다.이러한 재배치 덕분에 자주 검색되는 항목일수록 배열 앞쪽에 위치하게 되어, 이후 동일한 항목을 다시 검색할 때 더 적은 비교 횟수로 빠르게 찾을 수 있습니다. 이는 Move-to-Front 방식의 자기 조직화 리스트(self-organizing list)와 유사한

  3. C++로 주어진 간선 수만큼 무작위 무방향 그래프 생성하기

    이 글에서는 사용자가 입력한 간선의 개수 e를 바탕으로 무방향 랜덤 그래프(undirected random graph)를 생성하는 C++ 프로그램을 소개합니다. 랜덤 그래프 생성은 대규모 네트워크 시뮬레이션이나 그래프 알고리즘용 테스트 데이터를 만들 때 널리 활용되는 기법입니다. 간선을 생성하는 단계는 두 개의 난수를 뽑아 하나의 간선으로 연결하는 작업의 반복이므로 O(e)의 시간이 걸리며, 각 정점의 연결 상태를 모두 출력하는 단계는 정점마다 전체 간선 목록을 훑어야 하므로 전체적으로 O(N × e)의 시간 복잡도를 가집니다.

  4. C++ STL lexicographical_compare() 함수 완벽 정리: 개념부터 구현 예제까지

    C++ 표준 라이브러리(STL)의 알고리즘 헤더에 포함된 std::lexicographical_compare() 함수는 두 개의 요소 범위(range)를 비교하여, 첫 번째 범위가 두 번째 범위보다 사전식(lexicographically)으로 앞서는지, 즉 작은 값을 갖는지를 검사합니다.여기서 말하는 사전식 비교란 일반적으로 사전에서 단어를 알파벳 순서대로 정렬할 때 사용되는 비교 방식을 의미합니다. 문자열뿐만 아니라 반복자(iterator)로 접근 가능한 모든 컨테이너의 요소들에 적용할 수 있습니다.함수 선언template <

  5. C++ 파일 입출력: 텍스트 모드와 바이너리 모드의 차이점 완벽 정리

    C++ 텍스트 모드 vs 바이너리 모드, 무엇이 다를까? C++에서 파일 입출력은 크게 텍스트 모드(text mode)와 바이너리 모드(binary mode) 두 가지 방식으로 나뉩니다. 두 모드의 가장 큰 차이는 문자 변환(character translation) 여부입니다. 텍스트 모드: 개행 문자 등 특정 문자 변환이 자동으로 수행됩니다. 예를 들어 \r\n(캐리지 리턴 + 라인 피드) 조합이 \n으로 변환되어 처리됩니다. 바이너리 모드: 이러한 변환이 전혀 일어나지 않으며, 데이터가 원본 그대로 파일에 기록되거나 읽혀집니다

  6. C++에서 파일 크기 구하는 방법: seekg()와 tellg() 활용하기

    C++에서 파일의 크기를 확인하려면 먼저 파일을 연 뒤, 읽기 위치를 파일의 맨 끝으로 이동시킵니다. 이때 tellg() 함수를 호출하면 스트림의 현재 위치가 반환되는데, 이 값이 곧 파일 전체의 바이트 수입니다.핵심 원리는 간단합니다. seekg(0, ios::end)로 커서를 파일 끝으로 옮긴 후 tellg()가 가리키는 위치 값을 얻으면, 그것이 바로 파일의 크기입니다.예제 코드#include<iostream> #include<fstream> using namespace std; int main() {

  7. C++ ifstream으로 텍스트 파일에서 정수 읽는 방법

    C++에서 ifstream(입력 파일 스트림)을 사용하면 텍스트 파일에 저장된 정수 데이터를 손쉽게 읽어올 수 있습니다. 이 글에서는 a.txt라는 텍스트 파일에서 정수들을 하나씩 읽어 배열에 저장한 뒤 출력하는 기본적인 예제를 소개합니다.예제 코드#include <fstream> #include <iostream> using namespace std; int main() { // 배열 크기 초기화 int arr[30]; ifstream is("a.txt"); i

  8. C++ std::vector에서 인덱스로 요소 제거하는 방법

    C++의 std::vector에서 특정 인덱스에 위치한 요소를 제거하려면 erase() 멤버 함수를 사용하면 됩니다. erase()는 반복자(iterator)를 인수로 받아 해당 위치의 요소를 삭제하고, 삭제된 요소 바로 다음 위치를 가리키는 반복자를 반환합니다. 예제 코드 #include<iostream> #include<vector> using namespace std; int main() { vector<int> v; // 벡터 선언 // 벡터에 요소 삽입 v.push_b

  9. C++에서 참조 전달보다 포인터 전달이 유리한 경우는 언제일까?

    C++에서 함수에 객체를 전달할 때 포인터(pointer)와 참조(reference)는 모두 원본 객체에 접근할 수 있게 해주지만, 몇 가지 중요한 차이점이 있습니다.포인터 전달의 장점1. 널(null) 값 처리 가능포인터는 null 값을 가질 수 있는 반면, 참조는 반드시 유효한 객체를 가리켜야 합니다. 따라서 함수가 객체 없음(no object) 상태를 나타내야 하는 경우에는 반드시 포인터를 사용해야 합니다. 예를 들어 선택적(optional) 매개변수를 처리할 때 nullptr을 전달하는 방식은 매우 유용합니다.2. 호출 지점

  10. C++ 멤버 함수 포인터의 개념과 사용법 완벽 정리

    C++에서 클래스나 구조체의 멤버 함수(member function)를 다룰 때는 일반 함수 포인터와 달리 특별한 문법이 필요합니다. 멤버 함수 포인터는 객체 포인터 또는 this 호출을 통해 실행되며, 해당 클래스(또는 그 파생 클래스)의 멤버만 호출할 수 있어 타입 안전성(type safety)이 보장됩니다.멤버 함수 포인터란?일반 함수 포인터는 단순히 함수의 주소를 저장하지만, 멤버 함수 포인터는 클래스 범위(class scope)에 속해 있다는 점이 다릅니다. 따라서 선언 시 클래스 이름을 명시해야 하며, 호출할 때도 반드시

  11. C++ 포인터, 스마트 포인터, 공유 포인터 완벽 가이드

    포인터(Pointer)란?포인터는 변수의 메모리 주소를 저장하는 변수입니다. C++에서 포인터를 활용하면 메모리에 직접 접근할 수 있어 효율적인 프로그래밍이 가능합니다.선언 문법Type *pointer;초기화Type *pointer; pointer = &변수명;포인터의 주요 특징변수의 메모리 주소를 저장합니다.null 값을 할당할 수 있습니다.참조에 의한 전달(pass by reference)로 참조될 수 있습니다.포인터 자체도 스택(stack)에 고유한 메모리 주소와 크기를 가집니다.포인터 예제#include <iostrea

  12. C++ RAII와 스마트 포인터: 자원 관리의 핵심 기법

    C++에서의 RAII란?RAII(Resource Acquisition Is Initialization, 자원 획득은 곧 초기화)는 C++에서 자원의 생명 주기를 객체의 생명 주기에 연결해 관리하는 핵심 프로그래밍 기법입니다. 이 기법은 클래스 기반으로 구현되며, 자원의 획득과 해제를 컴파일러가 자동으로 처리하도록 만들어 줍니다.RAII는 여러 자원을 하나의 클래스로 캡슐화합니다. 객체가 생성될 때 생성자가 자원 할당을 담당하고, 객체가 소멸될 때 소멸자가 자원 해제를 수행합니다.이 덕분에 예외가 발생하거나 함수가 중간에 반환되더라도

  13. C++ 범위 지정 연산자(::)와 this 포인터의 차이점 완벽 정리

    C++에서 범위 지정 연산자(Scope Resolution Operator, ::)는 클래스의 정적(static) 멤버나 클래스 멤버에 접근할 때 사용되며, this 포인터는 지역 변수와 이름이 같은 멤버 변수가 있을 때 객체 자신의 멤버에 접근하기 위해 사용됩니다. 두 가지 모두 이름 가림(name hiding) 상황에서 유용하게 활용되지만, 접근 대상이 다르다는 점에서 차이가 있습니다. 1. 범위 지정 연산자(::)란? 범위 지정 연산자 ::는 클래스 외부에서 정적 멤버를 정의하거나, 함수 내부에서 지역 변수에 의해 가려진 클래

  14. C++ 포인터와 참조 매개변수의 차이점 한눈에 정리

    C++에서 함수에 값을 전달할 때 포인터(pointer)와 참조(reference)는 자주 혼동되는 개념입니다. 두 방식 모두 원본 변수에 접근할 수 있다는 공통점이 있지만, 동작 방식과 사용 규칙에서 중요한 차이가 있습니다. 이 글에서는 포인터와 참조의 기본 문법부터 핵심 차이점까지 자세히 살펴보겠습니다. 포인터(Pointer)란? 포인터 변수는 다른 변수의 메모리 주소를 저장하는 변수입니다. 포인터를 사용하면 해당 주소에 저장된 값에 간접적으로 접근하고 수정할 수 있습니다. 선언 문법 Type *pointer; 초기화 Ty

  15. C++에서 포인터를 참조로 전달해야 하는 이유

    C++에서 포인터를 참조로 전달하는 이유C++에서 함수에 인자를 전달할 때, 포인터가 가리키는 대상 객체가 아니라 포인터 자체의 값을 변경해야 하는 경우가 있습니다. 이럴 때 포인터를 참조(reference)로 전달하면 됩니다.일반적으로 포인터를 값으로 전달하면 함수 내부에서는 원본 포인터의 복사본만 조작하게 되므로, 호출자 측의 원본 포인터에는 아무런 영향을 주지 못합니다. 하지만 포인터를 참조(int*&)로 전달하면 함수 내부에서 수행한 모든 변경 사항이 원본 포인터에 그대로 반영됩니다.예제 코드아래 예제는 포인터를 참조

  16. C++에서 스택과 힙의 올바른 이해와 활용법

    C++ 프로그램이 실행될 때 메모리는 크게 스택(Stack)과 힙(Heap) 두 영역으로 나뉘어 관리됩니다. 각 영역의 특성을 정확히 이해하면 더 안정적이고 효율적인 코드를 작성할 수 있습니다.스택(Stack)이란?스택은 함수 내부에서 선언된 모든 지역 변수가 메모리를 할당받는 영역입니다. 즉, 함수 안에서 선언된 지역 변수는 모두 스택에 저장되며, 함수가 종료되는 순간 해당 변수들이 자동으로 해제됩니다.힙(Heap)이란?힙은 프로그램이 실행되는 동안 동적으로 메모리를 할당할 수 있는 여유 메모리 공간입니다. 선언된 함수보다 더 오

  17. C++로 푸는 순회 판매원 문제(TSP): 비가중 그래프의 최단 경로 구하기

    순회 판매원 문제(Travelling Salesman Problem, TSP)는 모든 도시를 한 번씩 방문한 뒤 다시 출발 도시로 돌아오는 최단 경로를 계산하는 대표적인 알고리즘 문제입니다. 그래프 관점에서 보면, 그래프에 존재하는 모든 노드를 거쳐 다시 시작 노드로 복귀하는 가장 짧은 경로를 찾는 방식으로 활용할 수 있습니다.이 글에서는 C++를 이용해 비가중(unweighted) 그래프의 최단 순회 경로를 구하는 프로그램을 소개합니다. 핵심 아이디어는 출발점을 제외한 나머지 정점들의 모든 순열(permutation)을 생성해 각

  18. C++로 배우는 최대 하위 배열 합 구하기: 이진 탐색(분할 정복) 접근법 완벽 가이드

    이진 탐색과 분할 정복이란?이진 탐색(Binary Search)은 실행 시간 복잡도가 O(log n)으로 매우 빠른 탐색 알고리즘입니다. 이 알고리즘은 분할 정복(Divide and Conquer) 원리를 기반으로 동작하며, 정상적으로 작동하려면 탐색 대상 데이터가 반드시 정렬된 상태여야 합니다.이진 탐색은 컬렉션의 가운데 요소와 찾고자 하는 값을 비교하는 방식으로 특정 항목을 찾습니다. 두 값이 일치하면 해당 요소의 인덱스를 반환하고, 가운데 요소가 찾는 값보다 크면 왼쪽 하위 배열에서, 그렇지 않으면 오른쪽 하위 배열에서 탐색을

  19. 희소 행렬(Sparse Matrix)을 판별하는 C++ 프로그램

    희소 행렬(sparse matrix)이란 행렬을 이루는 대다수의 요소가 0으로 채워져 있는 행렬을 의미합니다. 대표적인 예는 다음과 같습니다.아래 행렬에는 0이 총 5개 포함되어 있습니다. 0의 개수가 행렬 전체 요소 개수(9개)의 절반보다 많기 때문에, 이 행렬은 희소 행렬에 해당합니다.0 0 9 5 0 8 7 0 0희소 행렬은 불필요한 0 값을 압축하여 저장 공간을 크게 절약할 수 있어, 이미지 처리, 과학·공학 계산, 그래프 알고리즘 등 다양한 분야에서 널리 활용됩니다. 이번 글에서는 주어진 행렬이 희소 행렬인지 판별하는 C+

  20. C++로 배열에서 가장 가까운 점 쌍 찾기 (분할 정복 알고리즘)

    평면상에 흩어진 여러 점 중에서 서로 가장 가까운 두 점, 즉 최근접 점 쌍(closest pair of points)을 찾는 문제는 계산 기하학의 고전적인 문제입니다. 모든 점 쌍을 일일이 비교하는 완전 탐색은 O(n²)의 시간이 걸리지만, 분할 정복(Divide and Conquer) 기법을 활용하면 O(n log n)으로 성능을 크게 개선할 수 있습니다. 아래는 그 원리를 구현한 C++ 프로그램입니다. 알고리즘 1. 스트립(strip) 영역에서 최근접 거리 계산 분할 경계 근처의 점들만 모아 놓은 스트립 배열을 y좌표 기준

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:64/300  20-컴퓨터/Page Goto:1 58 59 60 61 62 63 64 65 66 67 68 69 70