분류 전체보기 125

[C++ String] string 나누기. string split

C++11 ~ 다른 여타 언어들과는 다르게, C++에서는 아직 string에서 바로 split을 할 수는 없다. 다만 몇 가지의 방법을 통해 split이 가능하다. #include #include #include using namespace std; vector splitStr(string orig, string deli){ vector res; // ??? return res; } int main(){ string longString(R"(split,this,string,how)"); auto&& SplitedStr = splitStr(longString, ","); for(const auto& str : SplitedStr){ cout

C++/기타 2023.03.04

[C++ keyword] noexcept

c++11 ~ 이 함수는 예외를 throw하지 않아요~ 라고 컴파일러에게 알려주는 키워드. 알려주면 뭐가 좋나? 컴파일러가 컴파일 할 때에 최적화를 좀 더 잘 해준다고 한다. 사용법 : void func1() noexcept; void swap() noexcept(true); void func3() noexcept(false); 이런 식으로. noexcept == noexcept(true) 이고, true, false를 써 놓은 곳엔 다른 표현식이 들어갈 수 있다. 그것을 이용하면 template T someFunc() noexcept(sizeof(T) < 4); 이런 식으로 조건부로 noexcept를 걸어줄 수도 있다. 다만 noexcept로 선언하여 컴파일러에게 '이 함수는 에러가 발생하지 않아!' ..

C++/기타 2023.03.02

[C++ keyword] explicit 란?

1. copy initialization을 막아주는 keyword. 해당 keyword를 붙이면 direct initialization만 가능하다. 2. 암시적 형변환을 막아주는 keyword. 그래서 그게 머임? 쉽게 표현하자면, copy initialization : = 뒤에 나오는 표현 식에 의해 초기화 될 때 direct initialization : (). {} 등으로 직접 초기화 될 때. -> 밑의 예시를 보자. struct A { A(int) { } A(int, int) { } }; struct B { explicit B(int) { } explicit B(int, int) { } }; 이런 식으로 explict를 쓰지 않은 A explict 를 쓴 B가 있다고 하자. 저 두 개의 A, B를..

C++/기타 2023.02.25

[C++ Container] map/unordered_map. at, []. element access 차이

C++11 ~ 빠른 결론 : 없었던 것을 access할 때 [] -> 빈 값으로 세팅한다. at -> out_of_range exception을 throw 한다. 나머지 부분은 전부 동일. map / unordered_map 에서 key를 통해 값을 가져오는 두 가지의 방법. map.at(KEY) map[KEY] #include #include #include using namespace std; int main() { map colorCode { {"red", "FF0000"}, {"green", "00FF00"}, {"blue", "0000FF"}, }; cout

C++/STL 2023.02.24

flyweight pattern

flyweight pattern 정의 : 플라이웨이트 패턴는 동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 메모리 사용량을 최소화하는 소프트웨어 디자인 패턴이다. 핵심 : 속성이 동일한 객체는 공유 할 수 있도록 만들자. flyweight #include #include #include // 속성이 동일한 객체는 공유 할수 있게 하자. - Flyweight class Image { std::string image_url; public: Image(const std::string& url) : image_url(url) { std::cout

Design Pattern 2022.12.01

iterator pattern

iterator pattern 정의 : 객체 지향 프로그래밍에서 반복자를 사용하여 컨테이너를 가로지르며 컨테이너의 요소들에 접근하는 디자인 패턴이다. 반복자 패턴은 컨테이너로부터 알고리즘을 분리시키며, 일부의 경우 알고리즘들은 필수적으로 컨테이너에 특화되어 있기 때문에 분리가 불가능하다. -> 서로 다른 자료구조들을 같은 방법으로 순회하고 싶다. #include int main() { std::List s = { 1,2,3,4,5 }; // 모든 요소가 떨어진 메모리 std::vector v = { 1,2,3,4,5 }; // 모든 요소가 연속된 메모리 } list는 보통 double linked list를 사용하여 구현되어있다 한다. 즉 요소 요소가 떨어져 있다. [ ←o→ ←o→ ←o→ ←o→ ] v..

Design Pattern 2022.11.20

Template Method

Template Method 정의 : 템플릿 메소드 패턴(template method pattern)은 소프트웨어 공학에서 동작 상의 알고리즘의 프로그램 뼈대를 정의하는 행위 디자인 패턴이다.[1] 알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단계들을 다시 정의할 수 있게 해준다 전체 ㅡ 부분의 관계를 가지는 객체들 사이의 관계를 정의할 때 유용하다 핵심 : 변하는 코드와 변하지 않는 코드를 분리하라. 변하는 코드를 가상 함수를 통하여 분리한다 : template method 변하는 코드를 class 를 통하여 분리한다 : strategy pattern (C++) 변하는 코드를 class의 template을 통하여 분리한다 : Policy Based class Template Method 예제 코드 ..

Design Pattern 2022.09.06

Observer Pattern

엑셀을 사용할 때, 서로 연결된 표와 그래프를 생각해 보자. 표만 수정을 하면 그래프가 변화한다. 어떻게 구현할 수 있을까? 테이블을 만들고, 그 테이블에 여러가지 그래프들이 붙을 수 있게 한다. 그래프가 표를 관찰하고 있다가 변하면 본인도 변하게 한다. 관찰자 패턴이라 하지만... 개인적으로는 본인 밑에 달린 여러 클래스들에게 통보하는 느낌이 강하다. ITable / Igraph를 생성. graph를 table에 붙였다 땟다 할 수 있게 만들어 보자. #include #include class ITable; // class 전방선언 struct IGraph { virtual void Update() = 0; virtual ~IGraph() {} ITable* AttachedTable; }; class ..

Design Pattern 2022.08.14
반응형