<

STL에 포함되어 있는 다양한 컨테이너(Vector, Map, List etc...)들은 Iterator를 기본 제공한다.


Iterator를 쉽게 설명하자면 컨테이너의 각각의 Index를 탐색 or 순환 할 수 있는 일종의 포인터 개념이다.


STL의 컨테이너에 Iterator를 붙여서 사용하면 일반 배열 탐색할때 인덱스를 반복문으로 훓으면서 쓰던것처럼 할 수 있다.


근데 문제는 이 Iterator를 쓰기 좀 번거롭다.


for (std::map<std::string, bool>::iterator iter = m_mapItemFlag.begin(); iter != m_mapItemFlag.end(); iter++)
{
	(*iter).second = bCheckFlag;
}

위의 코드처럼 Map이든 Vector든 내부의 각 원소를 전부 탐색해서 원소를 초기화 하거나 조건식을 추가하여 조건에 맞는 원소들의 값을 이용하는 것으로 많이 사용한다.



기존의 배열을 반복문과 함께 이용하는 것과 매우 흡사하다.



위처럼 Iterator를 컨테이너의 처음부터 끝까지 탐색할 경우 아래와 같은 방법으로 하면 쉽게 해결된다.


for (auto item : m_mapItemFlag)
{
	item.second = bCheckFlag;
}

C#보다 C++에 익숙한 사람은 auto 키워드에 낯설수도 있다. 나도 그랬다.


C#의 var 키워드 처럼 뒤에 대입받는 자료형에 따라 자동으로 해당 변수의 자료형을 선택해주는 아주 편한 키워드이다. 


하지만 남용하면 가독성이 떨어지므로 위와 같이 Range-based. 범위기반 반복문에서나 사용하자.



요약하자면 STL 컨테이너든, 일반 배열이든, 전체를 순차적으로 탐색할 때에는 위와 같은 범위기반 반복문을 사용하면 훨씬 편하다는 거다.


복잡하게 Iterator 생성해서 형식 맞춰주고 할 필요가 없다. 





지난번에 C++를 이용하여 로또(6/45) 번호를 생성하는 코드를 작성해봤는데 이번에는 C#을 이용하여 작성해봤다.


2019/03/29 - [Programming] - [C++] 로또 번호 생성 코드 (rand, list)



코드는 여타 로또 번호 생성하는 코드와 비슷하게 Rand함수를 이용한다.


C++ 이든 C#이든 Rand함수를 이용할 때 시드값(Seed)을 넣어줘야만 난수 생성시 중복되는 경우를 줄일 수 있다.


코드는 아래와 같다.


        private List GetLotteryNumber()
        {
            int nNum = 0;
            List listLottery = new List();
            for (int i = 0; i < LOTTONUM; i++)
            {
                Random rand = new Random(((int)DateTime.Now.Ticks) + i);
                nNum = rand.Next(1, 45);
 
                if(!listLottery.Contains(nNum))
                    listLottery.Add(nNum);
                else{
                    i--;
                    continue;
                }
            }
            return listLottery;
        } 


GetLotteryNumber 함수의 리턴값 타입으로 List를 이용했는데 이건 내가 쓰기 편해서 List를 이용했다.

더 쉬운 방법으로 배열을 이용하면 된다.

Random함수를 통해 난수를 1부터 45까지의 난수를 생성하여 중복된 값인지 체크하고 중복값이라면 반복문을 한스텝 빼주고 continue로 처리했다.


쌍용 티볼리(Tivoli), 티볼리 에어(Tivoli Air) 배터리 규격

 

구분 

규격 

가솔린 (휘발유)

 MF / 12V - 60AH

디젤 (경유) 

 MF / 12V - 80AH



수영용품 전문 브랜드 아레나(arena)에서 각 수영 영법별 정확한 자세를 움짤(gif)로 제공하여 블로그에 모셔왔다.


유튜브 동영상으로 보는것도 효과적이지만 단순하게 그린 애니메이션이 좀 더 이해하기 쉬울것 같다.


사진첩에 저장해놓고 수영 강습 전에 한번씩 봐야겠다.





자유형(freestyle)

자유형(freestyle)






배영(backstroke)





평영(breaststroke)










접영(butterfly)









각 이미지 출처

https://www.arenawaterinstinct.com/en_uk/community/training-technique/learn-how-to-swim-freestyle/

https://www.arenawaterinstinct.com/en_uk/community/training-technique/the-backstroke-how-to-swim-belly-upwards/

https://www.arenawaterinstinct.com/en_uk/community/training-technique/breaststroke-its-all-about-the-leg-kick/

https://www.arenawaterinstinct.com/en_uk/community/training-technique/butterfly-the-importance-of-the-leg-kick/


'Action' 카테고리의 다른 글

전화권유판매 수신거부의사 등록시스템  (0) 2019.06.06
수영 영법별 자세 아레나 움짤  (0) 2019.04.11
해외 배송정보 번역  (0) 2017.01.04
사업자 등록 신청요령  (0) 2013.01.06
1인 창조기업 해당 업종  (1) 2013.01.02


윈도우 API에서 제공하는 RECT는 구조체이다. 멤버로는 left, top, right, bottom 밖에 없다.

단순 사각형을 그리거나 위치 계산을 위한 구조체로 이용해 왔다.


RECT구조체와 비슷하게 MFC에서 제공하는 CRect 클래스가 있다.


RECT와 CRect 둘다 마찬가지로 사각형 영역의 위치를 처리하기 위한 타입이다.


CRect에 좀 더 다양하고 편리한 함수가 제공된다. 


예를 들어 위 두 사각형이 겹치는 영역을 구할때 사용하면 편리한 함수가 바로 IntersectRect이다.

CRect overlapRect = CRect(0, 0, 0, 0);
overlapRect.IntersectRect(rect1, rect2);
if (overlapRect.IsRectEmpty() || overlapRect.IsRectNull())
	//Do not overlap
 

중첩된 영역을 지정할 overlapRect를 선언후 IntersectRect 함수를 통해 rect1과 rect2를 피라메터로 넘겨주면


겹치는 영역이 overlapRect에 저장된다.


이후 IsRectEmpty() 나 .IsRectNull()로 겹치지 않았을 때 처리를 해주고 겹쳐진 영역을 이용하면 된다.




https://rutracker.org/forum/viewtopic.php?t=4127588

+ Recent posts