Programming Language/C++(56)
-
[C++] list iterator, inline
아래 링크 클릭 시 해당 본문으로 이동list iterator 전체 코드inlinelist iterator• 연결 리스트(std::list)에서 요소를 순회(탐색)하거나 삽입/삭제할 때 사용하는 iterator이다.list iterator 특징• 포인터처럼 동작한다.리스트의 요소를 가리키고 `*` 연산자로 값을 가져올 수 있다.• 양방향으로 이동이 가능하다.`++`는 다음 요소로, `--`는 이전 요소로 이동할 수 있다.• 리스트 요소를 삭제하면 해당 요소를 가리키는 iterator는 더 이상 유효하지 않으므로, 삭제 후 반드시 다시 설정해야 한다.`insert()`벡터는 연속적인 메모리 구조이기 때문에 중간에 끼워 넣으려면 뒤에 데이터들이 하나씩 밀려나야 돼서 비효율적이다.때문에 벡터에는 insert..
2024.03.22 -
[C++] erase() (+ clear() 문제점)
아래 링크 클릭 시 해당 본문으로 이동erase()erase() 구현erase()에서 반환하는 iterator의 의미, 삭제한 후 iterator가 다음 요소를 가리켜야 하는 이유erase() 예시 (CArr.h 전체 코드)예시 1 (myiter 삭제)예시 2 (++myiter 삭제)예시 3 (++myiter 출력)예시 4 (myiter++ 출력)예시 5 (역참조)예시 6 (begin()으로 다른 vector 가리키기)예시 7 (1~11 출력 및 짝수 제거)예시 8 (1~11 숫자 중 1~5 제거) - 수정 전예시 8 (1~11 숫자 중 1~5 제거) - 수정 후clear() 문제점erase()• vector 멤버 함수로, 인자로 iterator를 받으며 iterator가 가리키는 부분을 제거하는 함수이..
2024.03.21 -
[C++] iterator
iterator (반복자)• 저장된 데이터를 순회(iterate)할 수 있는 기능을 제공하는 객체• iterator는 포인터처럼 동작하지만 포인터가 아니라 클래스 객체이다.사용자가 데이터 구조의 내부 구현을 알 필요 없이 데이터를 순회할 수 있도록 돕는 공통 인터페이스를 제공한다.• 각 iterator는 자기가 구현되어있는 해당 자료구조에 맞게 동작한다.구현되어있는 컨테이너만 다를 뿐, 이름은 동일하고 사용법도 같다.• list의 경우 iterator는 노드의 주소를 저장하며, 연산자 오버로딩(`operator*`, `operator++`, `operator!=` 등)을 통해 데이터에 접근할 수 있도록 한다. iterator가 필요한 이유`std::vector`는 연속된 메모리 구조이므로 인덱스를 통해 ..
2024.03.20 -
[C++ STL] 벡터(vector), 리스트(list)
vector (벡터)• 배열처럼 연속적인 메모리를 사용하지만, 크기가 자동으로 조절되는 동적 배열이다.데이터 추가 시 공간이 부족하면 크기를 자동으로 늘린다.연속적인 메모리 구조이기 때문에 인덱스를 사용한 접근이 빠르다.vector 장단점장점단점• 인덱스로 데이터에 빠르게 접근할 수 있다. ➜ O(1)• 크기가 자동으로 조절되므로 수동으로 메모리를 관리할 필요가 없다.• push_back()로 데이터를 쉽게 추가할 수 있다.• 중간에서 데이터를 삽입하거나 삭제할 때는 느리다. ➜ O(n)• 크기를 늘릴 때 새로운 메모리를 할당하고 데이터를 복사하는 오버헤드가 발생한다.vector 헤더 파일#include vector 기본 형식std::vector 변수명;vector 선언using std::vector;v..
2024.03.19 -
[C++] 범위 지정 연산자(::), using namespace std;
범위 지정 연산자(Scope 연산자) `::`• 특정 범위를 확인해 보는 연산자`using namespace std;`직역하면 다음과 같다.➜ `using` : 사용한다➜ `namespace` : 네임스페이스(이름 공간)를➜ `std` : std라는std라는 네임스페이스(이름 공간)를 사용한다.using namespace std; // 이 문장을 직역하면 '표준 네임스페이스를 사용한다.'는 의미이다.`cin`, `cout` 기능을 사용하지 않는 상태에서 해당 기능을 사용하고 싶을 때 네임스페이스와 `::`를 매번 붙이기 번거롭다.`std::`를 쓰지 않고도 해당 기능을 사용하고 싶을 때 `std`(standard, 표준)라는 네임스페이스를 사용하겠다고 선언한다.그럼 `std`라는 네임스페이스가 없는 취..
2024.03.19 -
[C++] 구조체 · 클래스 템플릿으로 리스트 구현
코드를 작성할 때 노드는 구조체로, 리스트는 클래스로 만들었지만, C++에서 클래스와 구조체는 같아졌기 때문에 어떤 것을 사용하든 크게 상관은 없다.구조체도 생성자, 소멸자, 상속이 가능해졌다.단, 클래스와 구조체의 차이점은 범위 지정자의 기본값이 다르다는 것이다.구조체는 public이고 클래스는 private이다. 구조체와 클래스 중 어떤 것을 사용할지 모르겠을 때, 나름의 규칙을 만들면 좋다.ex) 기능이 많지 않을 때(단순히 데이터를 묶어놓고 데이터를 저장하는 등)는 구조체 키워드를, 리스트처럼 컨테이너로써의 복잡한 기능이면 클래스로 선언한다. ※ 구조체 템플릿은 구조체가 아니다.프로그래머는 넣은 데이터가 노드 단위인 것을 알 필요가 없어야 된다.다시 말해서, 리스트에 데이터를 넣을 뿐, 데이터를 ..
2024.03.18 -
[C++] 클래스를 이용한 가변 배열
CArr.h#pragma onceclass CArr // (C는 class라는 의미로 사용했다.){private: int* m_pInt; // 주소값 (m = 멤버라는 의미로 사용했다.) int m_iCount; // 현재 들어와있는 데이터 개수 int m_iMaxCount; // 최대 개수public: void push_back(int _iData); // 가변 배열로 따지면 데이터 추가 함수이다.public: CArr(); // 가변 배열로 따지면 => 배열 초기화 함수 ~CArr(); // 가변 배열로 따지면 => 배열 메모리 해제 함수}; CArr.cpp#include "CArr.h"// 생성자CArr::CArr() : m_pInt(nullptr) , m_iCount(0) , m_iM..
2024.03.18 -
[C++] 클래스 (+ 멤버 함수, this 포인터)
아래 링크 클릭 시 해당 본문으로 이동멤버 함수this 포인터클래스(Class)멤버 함수• 클래스가 사용하는 전용 함수 (클래스 내부에 정의된 함수)• 클래스의 객체가 필요하다.멤버 함수를 호출하려면 해당 클래스의 실체화가 되어있는 변수인 객체가 필요하다.• 멤버 함수를 객체를 통해서 호출하면 해당 객체의 주소가 this 포인터로 전달된다.this 포인터클래스의 멤버 함수를 호출 시 호출할 객체(instance, 인스턴스)를 찾으려면 this 포인터를 사용해야 한다.• 생략되어 있지만 모든 멤버 함수에 추가되어 있는 매개 변수로, 해당 멤버 함수를 호출한 객체의 주소를 가리키는 상수 포인터이다.this 포인터에 저장된 주소(현재 객체의 주소)를 수정할 수 없지만, const로 표시되지 않으면 가리키는 개..
2024.03.18