카테고리 없음2018. 5. 18. 16:24

C++ STL의 Map, Set 의 인자 삭제 관련하여,

보통 STL의 순환 중에는 인자를 삭제하지 않는다. 

이터레이터 무효화 때문인데, 위 순차 컨테이너에 대하여 반복문 내에서 삭제할 수 있도록 코드를 구성 해봤다.


 std::map<int, int> mapRemoveTest;
 for( int i = 80; i < 100; ++i ) { mapRemoveTest.emplace( i, i ); }
 for( int i = 10; i < 30; ++i ) { mapRemoveTest.emplace( i, i ); }
 for( int i = 0; i < 10; ++i ) { mapRemoveTest.emplace( i, i ); }
 for( int i = 30; i < 50; ++i ) { mapRemoveTest.emplace( i, i ); }
 for( int i = 70; i < 80; ++i ) { mapRemoveTest.emplace( i, i ); }
 for( int i = 50; i < 70; ++i ) { mapRemoveTest.emplace( i, i ); }
 
 for( auto i = mapRemoveTest.begin(), nexti = std::next( mapRemoveTest.begin(), !mapRemoveTest.empty() );
  mapRemoveTest.end() != i;
  i = ( mapRemoveTest.end() != nexti ) ? nexti++ : nexti )
 {
  mapRemoveTest.erase( i );
 }


위 mapRemoveTest 컨테이너에는 0~99 까지 100개의 int가 삽입 되어 있다.


아래 for문에서는 i인덱스(현재 offset)를 통해 인자를 삭제하며,

nexti인덱스(다음 offset)을 통해 이터레이터의 무효화를 막아주고 있다.


가독성이 안좋은 코드이기 때문에 현업에서는 무리지만,

개인 프로젝트나 메모리를 극한으로 아껴야 하는 상황에는 활용해도 좋을 것 같다.


잊지 않기 위해 기억해둔다.

Posted by 비엔나햄
내가만든/라인들2017. 8. 13. 22:34

C# WPF로 만든 파일 복사 툴

WpfApplication1.zip


WpfApplication1 (2).zip

 

Release.zip


Posted by 비엔나햄
내가만든/연습장2017. 6. 26. 22:08

1. 캡슐화 - 접근 제어를 통해 숨기고 싶은 데이터에 대해 정보 은닉 하는 것.

2. 상속 - 코드를 물려주거나 물려받아, 재사용 하는 것.

3. 다형성 - 다양한 형태로 기능을 구현하는것. 오버라이딩과 오버로딩등으로 동적 바인딩을 한다.

4. 추상화 - 객체들의 공통적인 특징을 뽑아 멤버로 만드는 과정.

Posted by 비엔나햄
카테고리 없음2017. 3. 26. 21:48

WINAPI 함수중 ReadDirectoryChangesW()를 사용하여 파일 변화를 감지 한다.

폴더 및 파일을 감지하여 변경된 파일의 위치와 이름을 리턴해준다.

 

IOCP를 이용하여 파일 변경알림이 통지되면 처리하도록 구현 해보았다.

ReadFileChange.hpp

 

 

Posted by 비엔나햄
카테고리 없음2017. 2. 9. 19:07

1일차.zip - this, const

2일차.zip - new, 변환

3일차.zip - smart pointer

넥슨4일차.zip - template

Posted by 비엔나햄
카테고리 없음2016. 11. 27. 22:25

C#으로 제작

POTG.zip

 

Posted by 비엔나햄
내가만든/라인들2016. 11. 27. 15:24

 

C++의 가변인자 템플릿을 이용한 문자열 생성 클래스

Write메서드의 인자로 원하는 값을 넣어주면 계속해서 append 된다.

 

단, char형에 대한 제약이 좀 필요 하다.

Write('a'); 라고 호출했을 경우,

a는 아스키 코드의 97로 인식이 되고 이것을 97이라는 "숫자"로 입력을 할 것인가,

혹은 아스키코드 97이 가리키는 값인 문자 'a'로 입력을 할 것인가 의 선택을 결정 해야 한다.

 

현재는 unsigned char형 일때에만 "숫자"로 입력을 하고 있는데,

내 생각에 가장 좋은 규약은 문자를 표현하고자 할때에는 전부 "문자열"로 입력을 하는 것이다.

 

어중간하게 Byte(unsigned char)같은 형을 통해 정수를 전달하는 행위를 없애고,

숫자는 -> 숫자 / 문자는 > 문자열 로 입력하는 약속을 정해서 사용하면 문제가 없을 것 같다.

 

그리고 이 클래스는 내부에서 재귀호출을 수행하므로 속도는 다소 떨어질 수 있다.

하지만 스트링 포맷을 맞추지 않아도 되기 때문에 대단히 편리하게 사용 될 것이다.

 

AutoString.h

 

'내가만든 > 라인들' 카테고리의 다른 글

파일 복사툴  (0) 2017.08.13
[피보나치] 피보나치 DP방식 코드  (0) 2016.10.30
메신저 서버  (0) 2016.07.22
[Float Compare] 실수형 데이터 비교  (0) 2016.06.30
[가중치 랜덤] h파일과 사용 예제  (0) 2016.06.30
Posted by 비엔나햄
내가만든/라인들2016. 10. 30. 14:58

C++ 사용, 스마트 포인터 및 STL Map 컨테이너 사용.

재귀호출을 이용한 피보나치 수열의 n번째 값을 리턴 하는 함수이다.

STL Map 컨테이너를 사용하여 결과 값을 저장하고 중복된 계산을 하지 않는 동적 계획 방식을 사용하여 속도를 줄였다.

 

// n은 얻고자 하는 인덱스, pDpMapPtr은 Map의 포인터로써 입력 하지 않아도됨

int Fibo( int n, std::shared_ptr<std::map<int, int>> *pDpMapPtr = nullptr )
{
 if( 1 >= n )
  return 0;

 std::shared_ptr<std::map<int, int>> stSharedPtr;
 if( nullptr == pDpMapPtr )
 {
  auto map = new std::map<int, int>();
  map->emplace( std::map<int, int>::value_type(2, 1) );
  stSharedPtr.reset( map );
  pDpMapPtr = &stSharedPtr;
 }
 else
  stSharedPtr = *pDpMapPtr;

 auto map = stSharedPtr->find(n);
 if( stSharedPtr->end() == map )
 {
  map = stSharedPtr->emplace( std::move( std::map<int, int>::value_type( n, Fibo( n - 2, &stSharedPtr ) + Fibo( n - 1, &stSharedPtr ) ) ) ).first;
 }
 return map->second;
}

 

void main()

{

cout << Fibo(10) << endl;

}

 

일반 적인 재귀 호출과 비교 했을때, 수십배 빠른성능을 보인다.

N이 커질 수록 갭은 더 커진다.

함수 호출 전에 위의 공유 포인터를 먼저 만들고 사용하면, 위 함수를 여러번 호출하는 경우( ex) Fibo(5); Fibo(4); 이런식으로 반복호출 될 경우 ) 더 빠른 성능을 보여준다.

'내가만든 > 라인들' 카테고리의 다른 글

파일 복사툴  (0) 2017.08.13
[AutoString] 헤더 파일과 사용시 주의점  (0) 2016.11.27
메신저 서버  (0) 2016.07.22
[Float Compare] 실수형 데이터 비교  (0) 2016.06.30
[가중치 랜덤] h파일과 사용 예제  (0) 2016.06.30
Posted by 비엔나햄
내가만든/라인들2016. 7. 22. 18:14

ChatServer.zip

C#

채팅서버를 생각 하며 만들었지만..

유저가 접속하고, 방을 개설하고 채팅을 할 수 있는 구조라는게 요즘의 메신저와 비슷 하다는 생각을 하며 프로젝트 방향 수정!

C#을 이요하기 때문에 제공 되는 라이브러리가 많고, .Net FramWork의 API들을 사용할 수 있어서 좋다. 하지만, 확실히 알고 써야지 안그러면 찾을 수도 없는 오류가 발생하더라...ㅠ

( ex) 소켓을 안닫은 채로 봇을 무작위로 붙이다보면 소켓 capacity가 넘어서 오류가 나는데 그냥 Memory accsess Violation 이라는 예외 처리가 발생함.. 찾기 어려웠음)

 

서버 - 클라이언트를 구현 중이고, 이 부분이 완료 되면 REDIS를 이용해 대화 내용들을 전체를 유저(클라이언트)에게 전달 할 수 있도록 구조를 계획 중이다.

 

#2

리팩토링중...

ChatServer.zip

 

Posted by 비엔나햄
내가만든/라인들2016. 6. 30. 11:29

bool FloatCompare(float a, float b)
 {
  return fabsf(a - b) < FLT_EPSILON;
 }

 

실수형 타입 변수는 소수점 아래 값에 오차가 있기 때문에, 별도의 대/소/등호 검사 로직을 사용 해야 한다.

개념은 두 실수 값의 차가 FLT_EPSPILON 보다 작으면 같다. 이다.

ex) 1.001 - 1.0009 < 0.002 같은 형태로 사용 된다.

'내가만든 > 라인들' 카테고리의 다른 글

[피보나치] 피보나치 DP방식 코드  (0) 2016.10.30
메신저 서버  (0) 2016.07.22
[가중치 랜덤] h파일과 사용 예제  (0) 2016.06.30
[로또 번호추출] 로또 번호  (1) 2016.04.03
[이미지 비교] 실행파일  (0) 2016.03.27
Posted by 비엔나햄