C++(8)

송예원·2024년 7월 30일

c++

목록 보기
8/12
  1. C++ 표준 라이브러리

1) 표준 라이브러리 구성과 사용법

  • 표준 라이브러리: 효율적이고 안정적인 코드 작성에 도움이 되는, 어느 프로그램에서나 자주 쓰는 코드를 제공하는 라이브러리.
  • 입출력, 문자열처리, 컨테이너, 알고리즘 등의 기능 제공
  • 표준 라이브러리 헤더 사이트에서 헤더파일의 목록을 찾아 쉽게 사용 가능
  • 표준 라이브러리 사용방법: #include <헤더파일이름>
    ex) #include <iostream>
    => iostream 헤더파일의 모든 내용을 복사해 해당 소스파일에서 iostream 헤더파일에 정의된 기능 사용을 가능하게 해줌

  • 일반적으로 헤더파일에는 함수와 변수가 선언만 되어있고, 실제 내용은 링크단계에서 자동으로 연결되는 표준 런타임 라이브러리에 구현되어있음
    ex) std::cout 은 iostram 헤더에 선언되어있지만, 링크단계에서 연결되는 표준 런타임 라이브러리에 정의되어있음

2) 문자열 라이브러리

  • 표준 문자열 라이브러리: <string>
    사용: #include <string>
    • length: 문자열의 길이 반환
      문자열.length()
    • size: 메모리의 크기 반환
      문자열.size()
    • empty: 빈 문자열인지 검사 (true/ false)
      문자열.empty()
    • append: 문자열 추가 (문자열 끝에 새로운 문자열 추가)
      문자열.append("추가할 문자열")
      문자열.append("추가할 문자열", 문자열 시작인덱스, 문자 개수)
    • find: 문자열 찾기
      (원하는 문자열의 시작위치 반환, 찾지 못하면 string::npos 반환)
      문자열.find("찾을 문자열")
      문자열.find("찾을 문자")
      문자열.find("찾을 문자열", 시작위치)
    • compare: 문자열 비교하기
      0: 두 문자열이 완전히 같음
      양수: 대상 문자열이 더 길거나 일치하지 않는 첫번째 문자가 더 큼
      음수: 대상 문자열이 더 짧거나 일치하지 않는 첫번째 문자가 더 작음
      대상 문자열.compare(비교할 문자열)
    • replace: 문자열 교체하기
      문자열.replace(교체할 문자열)
    • wstring: 와이드 문자열: 유니코드 문자열 저장, 출력
      #include <iostream>과 함께 사용, 와이드 문자열을 처리하기 위해 L 접두사를 사용
      ex) 와이드 문자열 형식 활용
      std::wstring name;
      std::wcout <<L"이름을 입력하세요: ";
      std::wcin>> name;

3) 파일 시스템

  • 파일 시스템: 데이터를 저장하고 관리하는 체계
    파일 시스템 라이브러리: 파일에 관한 정보에 접근 가능 (파일 자체 읽기X)
    (파일 읽기: <fstream>, 데이터의 입출력을 담당)
  • 파일 시스템 라이브러리: <filesystem>
    파일 시스템 라이브러리는 파일과 디렉터리 조작에 유용한 기능을 여럿 제공 (단, C++17 이상이 필요)
  • 절대 경로와 상대 경로
    • 경로: 해당 파일의 위치를 나타내는 고유 주소
    • 절대 경로: 최상위 디렉터리인 루트에서 내가 원하는 파일까지의 전체 경로 (경로의 맨 앞이 루트로 시작)
    • 상대 경로: 현재 위치를 기준으로 한 경로
    • path: 파일 시스템 라이브러리에서 파일이나 디렉터리를 다루는 모든 함수가 매개변수로 받는 객체= 경로 나타내기
    • exists: 해당 경로에 파일이 실제로 존재하는지 확인하는 함수
      bool exists (const std:: filesystem:: path& p)
  • 파일 시스템 활용하기
    • boost::filesystem: 표준 라이브러리보다 더 널리 사용되는 템플릿 라이브러리 집합, 대부분의 경우 헤더 파일만 포함하면 됨
      boost::filesystem을 사용하려면 해당 시스템에 맞게 컴파일된 라이브러리가 필요
  • 디렉터리 생성: create_directories
  • 파일 생성과 쓰기: ofstream
  • 파일 닫기: outFile.close, inFile.close
  • 파일 읽기: ifstream
  • 파일 내용 한줄씩 읽기: getline
  • 파일 삭제: remove_all (디렉터리, 파일 모두 삭제)


    +) directory_iterator: 특정 디렉터리에 대한 반복자 역할, 디렉터리 내의 파일과 하위 디렉터리에 대한 정보를 제공하며 각 반복에서 directory_entry 객체를 반환=> 디렉터리 내의 파일이나 디렉터리 작업 수행 가능

4) 기타 유용한 함수

  • 난수 생성: <random> 헤더파일 이용
    std::mt19937 or std::mt19937_64 + mt_rand()
    난수를 여러개 생성할 때 중복되는 난수가 발생하지 않게 하려면...
    시드값 or 하드웨어 엔트로피 (시스템에서 발생하는 무작위성의 정도) 이용
    (random_device 클래스 이용해 하드웨어 엔트로피 이용 가능)

  • <random>이 제공하는 난수 생성 엔진
    • random_device (엔진의 시드값 생성)
    • linear_congruential_engine (선형 합동 난수 엔진)
    • mersenne_twister_engine (메르센 트위스터 난수 엔진)
    • subtract_with_carry_engine (감산 캐리 난수 엔진)
  • 수학 함수: cmath 헤더파일 이용
    • abs: 절댓값
    • sqrt: 제곱근
    • pow: 거듭제곱
    • exp: 지수함수
    • log: 자연 로그
    • sin, cos, tan: 삼각함수
    • asin, acos, atan: 역삼각함수
    • cell: 올림
    • floor: 내림
    • round: 반올림
  • 복사 함수
    • 얕은 복사: 주솟값을 복사, 두 객체가 동일한 메모리 공간을 참조하게 됨. 한 객체에서 값을 변경하면 다른 객체에서도 그 변경사항이 반영되기 때문에 메모리 관리에서 문제가 발생할 수 있음
      따로 제공하는 얕은 복사 전용 함수는 X
    • 깊은 복사: 실제 값을 새로운 메모리 공간에 복사, 두 객체는 서로 독립적인 메모리 공간을 가지게 되어 한 객체의 변경이 다른 객체에 영향을 미치지 않습니다. 깊은 복사는 메모리 사용의 안전성을 보장
    • copy: 깊은 복사 함수, 서로 다른 독립적인 메모리에 실제 값을 복사
      깊은 복사를 반복문으로 구현하면 비효율적이기 때문에 제공


      +) copy 함수 원형:
      template <class_InIt, class_OutIt>
      _CONSTEXPR20 _OutIt copy(_InIt _First, _InIt _Last, _OutIt _Dest)

0개의 댓글