cpp

벡터의 for loop 일반적으로 for loop문을 돌리는 방법에는 3가지가 있다. 1. Index 2. Iterator 3. Ranged based for loop (C++ 11) 이 세가지 방법 중에서 Iterator와 Ranged based for loop는 비슷한 구조로 돌아간다. 결론부터 말하면 ranged based for loop이 가장 안전하고 표준의 방법이다. 하지만 for loop 안에서 Index 정보가 필요하다면 Index를 사용한 for loop문을 사용해야 하는 경우도 있다. 예제 "how many elements?" 가 출력된 후에 입력을 받고, 입력을 받으면 입력된 수 n 개의 숫자 1이 들어가 있는 벡터를 만들어 주었다. 각 elelment에 2를 곱해주는 Index 베이..
vector 오브젝트의 size와 capacity, 그리고 reserve 메소드 이전 게시글에서 벡터의 시간 복잡도 Time complexity에 대하여 다뤘다. 벡터의 마지막에 삽입/제거할 경우에는 O(1) 의 Time Complexity를 가진다고 이야기했다. 하지만 이런 O(1)의 시간 복잡도는 항상 보장되는 것이 아니다. 실제로는 가끔 O(n) 의 시간 복잡도를 가지게 된다. 예시를 통해 간단히 살펴보면, #include #include int main() { std::vector nums; std::cout
연속적인 메모리 공간을 heap에 가질 수 있는 벡터 컨테이너에 대해 조금 더 알아보자. Cppreference에서 vector를 검색해보면 time complexity에 대한 내용이 나온다. https://en.cppreference.com/w/cpp/container/vector std::vector - cppreference.com template class vector; (1) (2) (since C++17) 1) std::vector is a sequence container that encapsulates dynamic size arrays. The elements are stored contiguously, wh..
벡터란? : std::vector is a sequence container that encapsulates dynamic size arrays. 벡터는 연속적인 컨테이너인데 dynamic size array를 캡슐화 한 것 이란 뜻이다. Dynamic size array를 벡터를 사용하지 않고 만드는 법은 cpp를 어느정도 공부했다면 알고 있을 것이다. int main() { int* numsPtr = new int[5]; for (int i = 0; i < 5; i++) { numsPtr[i] = i; } delete numsPtr; }; 이렇게 int형 포인터를 만들고 for문을 통해 숫자를 넣어주고 delete를 통해 할당 해제해주면 된다. 그림으로 보면, 스택 위에 numsptr이란 포인터가 만..
결론: 사용하지 마세요 Dynamic Cast: RTTI (RunTime Type Information) 을 사용하는 것인데 대부분의 C++ 프로젝트에선 사용을 금지하고 있다. 구글 C++ 스타일 가이드의 RTTI 파트를 보면, Avoid using Run Time Type Information 부분에서 Dynamic Cast를 사용하지 말 것을 주문하고 있다. 이 접근 자체가 클래스 구조를 잘못 짠 것이고, 이런 RTTI가 없는 코드가 유지보수가 쉬운 코드라는 것이다. https://google.github.io/styleguide/cppguide.html Google C++ Style Guide Google C++ Style Guide Background C++ is one of the main de..
다음과 같은 코드를 짰을 때, 컴파일러가 알아서 만들어주는 메소드들이 있다. 1. Constructor 2. Destructor 3. copy/move Constructor 4. copy/move Assignment : 일반적으로 Constructor는 직접 만들어주고 destructor을 포함한 나머지 5가지 메소드들은 직접 만들어주지 않는다. but 이렇게 포인터를 활용해서 리소스를 관리하게 되면 개발자가 직접 이 5가지의 메소드를 관리해 주어야 한다. 구글에서 c++ rule of three / rule of five 로 검색하게 되면 cppreference에서 관련 내용을 확인 가능하다. https://en.cppreference.com/w/cpp/language/rule_of_three The ..
멤버 생성 리스트에 대해서 알아보면, 크게 Class의 컨스트럭터와 디스트럭터가 있다. 1. Constructor : Object가 생성될 때 불러지는 함수. 클래스 이름과 같은 함수를 만들면 완성됨. 2. Destructor : Object가 없어질 때 불러지는 함수 클래스 이름 앞에 ~가 붙은 함수를 만들면 완성됨. ex) Compiler Explorer로 어셈블리 코드를 확인해 보면, 메인 함수 안에서 다른 함수를 부르는 call 명령어를 확인해 보면, 처음에 고양이 컨스트럭터 Cat::Cat(), 다음으로 Cat::speak(), 마지막으로 고양이 디스트럭터 Cat::~Cat() 가 순서대로 불려지는 걸 확인할 수 있다. 즉 컨스트럭터와 디스트럭터는 클래스 안에서 마법처럼 동작하는 것이 아니라, ..
1. Pass by Value a 가 Pass by Value 되며 카피되면서 foo 에 a=0 이 들어가게 되고, 로컬변수 b는 a+1이니까 1이 들어가게 된다. 결국 값이 복사가 되는 것. 2. Pass by Pointer 함수에서 매개변수로 포인터를 받게 되면, 이 포인터는 함수 바깥에 있는 변수에 접근 가능하다! 만약 예를 들어서, fooP() 에 *ap = 100 을 써주게 되면 어떻게 될까? fooP가 동작할 때 a 공간에 접근을 해서 값을 100으로 바꿔주는 코드가 된다. (접근 가능!) 3. Call by Reference 레퍼런스를 받는 fooR() 함수를 만들어주고 콜 해 주는 코드를 짜 보자. 사실 포인터로 넘겨주는 함수와 레퍼런스로 넘겨주는 함수 두 개는 똑같다. Compiler E..
HeadlessCreator
'cpp' 태그의 글 목록