#include <iostream>

using namespace std;

struct TestStruct {
public:
	TestStruct(const int _num, const int _cnum, int* _pnum) : num(_num), cnum(_cnum), pnum(_pnum) {}
	~TestStruct() {
		if (nullptr != pnum) {
			delete pnum;
			pnum = nullptr;
		}
	}

private:
	int num;
	const int cnum;
	int* pnum;
};

int main() {
	FILE* pWriteFile = nullptr;
	if (errno_t err = fopen_s(&pWriteFile, "../Data/test.bin", "wb"))
		return 0;

	TestStruct* pTest1 = new TestStruct(10, 20, new int(30));

	fwrite(pTest1, sizeof(TestStruct), 1, pWriteFile);
	fclose(pWriteFile);

	delete pTest1;
	pTest1 = nullptr;

	/* ---------------- */

	FILE* pReadFile = nullptr;
	if (errno_t err = fopen_s(&pReadFile, "../Data/test.bin", "rb"))
		return 0;

	TestStruct* pTest2 = new TestStruct(50, 60, nullptr);

	fread(pTest2, sizeof(TestStruct), 1, pReadFile); // const 멤버 변수가 있는데 어떻게 가능한지
	fclose(pReadFile);

	delete pTest2;
	pTest2 = nullptr;

	return 0;
}

 

구조체 멤버변수 cnum은 const라서 초기화 이후 수정이 되면 안되는데 fread를 통해 스트림의 데이터를 구조체 크기만큼 덮어쓰니까 에러가 발생하지 않고 값이 바뀌어버림.

 

포인터나 레퍼런스가 아니라서 const_cast가 적용될리도 없고 애초에 c함수라서 const_cast가 존재하지 않음

대체 왜..?

'프로그래밍 > 공부' 카테고리의 다른 글

선언과 정의의 차이  (0) 2022.09.28
[자료구조] 힙  (0) 2022.07.23
[자료구조] 트리, 그래프  (0) 2022.07.23
Effective C++ [4] 설계 및 선언  (0) 2015.07.10
Effective C++ [3] 자원관리  (0) 2015.07.09

선언은 메모리 할당이 되지 않는다.

선언은 여러번 선언할 수 있지만 정의는 딱 한번만 이루어져야 한다.

'프로그래밍 > 공부' 카테고리의 다른 글

C의 fread에 관한 의문점  (0) 2023.02.01
[자료구조] 힙  (0) 2022.07.23
[자료구조] 트리, 그래프  (0) 2022.07.23
Effective C++ [4] 설계 및 선언  (0) 2015.07.10
Effective C++ [3] 자원관리  (0) 2015.07.09

힙은 완전 이진트리로 구현된다. 우선순위 큐를 구현할때 힙을 사용한다.

이진 탐색 트리와 다르게 중복 값을 허용한다.

최소, 최대값만 루트 노드에 있고 그 외엔 큰 값이 상위레벨, 작은 값이 하위레벨에 있다는 정도의 반 정렬 상태를 유지한다.

pop 호출시 항상 루트노드가 제거되고 최소, 최대값이 나오게 된다.

삽입과 삭제에 시행되는 재정렬 과정이 O(NlogN) 이기 때문에 O(NlogN)을 보장한다.

보통 배열을 사용한다.

 

힙의 삽입 (최소힙 기준)

 

1. 힙에 새로운 요소가 들어오면 마지막 노드에 어어서 삽입한다

2. 부모 노드보다 값이 작으면 서로 바꾼다.

3. 2번이 수행되지 않을때까지 루트노드로 올라가며 반복한다.

 

힙의 삭제 (최소힙 기준)

 

1. 루트 노드를 삭제 한다. (가장 끝의 리프노드와 값 교환후, pop)

2. 둘 중 작은값을 가진 자식과 위치 교환

3. 조건을 만족하지 않거나 리프노드가 될 때까지 2번을 반복한다.

 

'프로그래밍 > 공부' 카테고리의 다른 글

C의 fread에 관한 의문점  (0) 2023.02.01
선언과 정의의 차이  (0) 2022.09.28
[자료구조] 트리, 그래프  (0) 2022.07.23
Effective C++ [4] 설계 및 선언  (0) 2015.07.10
Effective C++ [3] 자원관리  (0) 2015.07.09

[트리]

 

계층적인 자료구조이다.

노드와 간선으로 이루어져서 그래프의 일종으로 볼 수 있고 최소 연결 트리 라고도 불린다. (N=N, E=N-1)

간선의 비용은 따로 없고 사이클이 존재할 수 없다.

 

 

 

트리는 그래프의 일종이므로 인접 배열 또는 인접 리스트로 구현된다.

 

이진 트리, 이진 탐색 트리, 균형 트리(AVL, red-black), 최대/최소 힙 등이 있다.

 

트리의 순회

좌, 우의 순회를 재귀적으로 수행할 때 먼저 수행하면 전위 순회, 재귀함수 사이에 수행하면 중위 순회, 재귀함수 뒤쪽에 수행하면 후위 순회가 된다

 

트라이(trie, Prefix Tree) : n-차 트리의 변종. 각 노드에 문자를 저장하기 때문에 아래쪽으로 순회하면 단어 하나가 나온다.

접두사를 빠르게 찾아보기 위한 흔한 방식이다.

 

 

[그래프]

 

노드와 간선을 하나로 모아놓은 자료구조이다.

 

오일러 경로 : 그래프의 모든 정점에 연결된 간선의 개수가 짝수일 때만 오일러 경로가 존재한다.

 

트리와 달리 부모/자식, 루트 노드라는 개념이 없다.

순회는 DFS 또는 BFS로 이루어진다.

무방향 또는 방향 그래프로 나뉜다. 여기에 가중치가 붙을수도 있다.

트리에서는 특정 노드 하나로 다른 모든 노드에 접근이 가능했지만 그래프는 그렇지 않을수도 있다.

 

인접 리스트 또는 인접 행렬로 구현된다.

보통 인접 리스트로 구현된다.

인접 행렬로 구현되는 경우 2차원 배열을 써야하기 때문에 공간 복잡도는 항상 O(N²)이다.

'프로그래밍 > 공부' 카테고리의 다른 글

선언과 정의의 차이  (0) 2022.09.28
[자료구조] 힙  (0) 2022.07.23
Effective C++ [4] 설계 및 선언  (0) 2015.07.10
Effective C++ [3] 자원관리  (0) 2015.07.09
Effective C++ [2] 생성자, 소멸자 및 대입 연산자  (0) 2015.07.08

Chapter 4 설계 및 선언


* 인터페이스 설계는 제대로 쓰기는 쉽게, 엉터리로 쓰기에는 어렵게 한다.

예를들어 어떤 객체나 함수에 값을 전달하는데 잘못된 값 또는 잘못된 범위를 입력하면 오류가 발생하도록 만드는 등의 설계가 필요함.


* 멤버함수에서 객체를 생성하는 경우 객체의 포인터를 반환하기 보다 애초에 스마트 포인터를 반환하는 것이 문제의 소지를 덜 발생시킨다.


* 실수를 방지하는 방법

- 새로운 타입 만들기

- 타입에 대한 연산을 제한하기

- 객체의 값에 대해 제약 걸기

- 자원 관리 작업을 사용자 책임으로 놓지 않기


* 스마트포인터(shared_ptr)은 교차 DLL 문제를 미연에 방지해준다.


* 값에 의한 전달(pass-by-value)보다는 상수객체 참조자에 의한 전달(pass-by-reference) 방식을 택하는 편이 대개 낫다.

- 값에 의한 전달로 객체를 받을 경우 복사생성자에 의해 생성되며 다시 소멸이 이루어진다. 엄청난 비용이 소모됨. 복사손실 문제까지 막아준다.

- 기본제공 타입(char, int 등), STL 반복자, 함수객체 타입에 대해서는 값에 의한 전달이 더 적절하다.



+ Recent posts