Visual Studio 2010 공식 팀 블로그 @vsts2010

'흥배'에 해당되는 글 65건

  1. 2012/01/19 [미리 보는 C++11] 7. chrono - 3 (2)
  2. 2011/12/07 [미리 보는 C++11] 7. chrono - 2 (1)
  3. 2011/11/16 [미리 보는 C++11] 7. chrono - 1 (2)
  4. 2011/10/12 [미리 보는 C++11] 6. Boost 라이브러리 설치 (1)
  5. 2011/10/06 [미리 보는 C++11] 5. enum (6)
  6. 2011/09/23 [미리 보는 C++11] 4. constexpr - 2 (1)
  7. 2011/09/15 [미리 보는 C++11] 3. constexpr - 1 (1)
  8. 2011/08/30 [미리 보는 C++11] 2. override와 final (10)
  9. 2011/08/22 [미리 보는 C++11] 1. UTF-8, UTF-16(char_16t), UTF-32(char32_t) 문자형 (7)
  10. 2011/06/21 [STL] 15. VC++ 10에 추가된 새로운 컨테이너 forward_list – 사용편 (3)
  11. 2011/06/14 [STL] 14. VC++ 10에 추가된 새로운 컨테이너 forward_list – 소개편 (4)
  12. 2011/05/30 [STL] 13. <algorithm>에 추가된 새로운 함수들 minmax_element (3)
  13. 2011/05/19 [STL] 12. <algorithm>에 추가된 새로운 함수들 iota (1)
  14. 2011/05/11 [STL] 11. <algorithm>에 추가된 새로운 함수들 is_heap, is_heap_until (3)
  15. 2011/04/25 [STL] 10. <algorithm>에 추가된 새로운 함수들 is_sorted, is_sorted_until (4)
  16. 2011/04/20 Native C++ 개발자를 위한 C++/CLI (6)
  17. 2011/04/19 [STL] 9. <algorithm>에 추가된 새로운 함수들 is_partitioned, partition_point (3)
  18. 2011/04/19 STL을 아직 공부하지 않으신 분들은 이 글들을 참고하세요
  19. 2011/04/12 [STL] 8. <algorithm>에 추가된 새로운 함수들 - partition_copy (2)
  20. 2010/11/17 [Step. 17] 델리게이트에 비관리 함수를 할당하기 그리고 다음 예고 (2)
Posted by 흥배

요즘 바쁘다 보니 아주 오랜만에 글을 올리게 되었습니다^^;

이번 시간에는 chrono를 사용하여 시간 계산에 대해서 간단하게 설명 하겠습니다.

 

이전 시간에서 보았듯이 chrono는 아래와 같이 다양한 타입으로 시간을 표시할 수 있습니다.

 

boost::chrono::nanoseconds  // 나노 세컨드. 10억분의 1

boost::chrono::microseconds // 마이크로 세컨드. 100만분의 1

boost::chrono::milliseconds  // 밀리 세컨드. 1000분의 1

boost::chrono::seconds      //

boost::chrono::minutes      //

boost::chrono::hours        //

 

 

각 시간 타입 별로 생성할 때 값을 설정할 수 있습니다.

boost::chrono::hours H1(1); // 1시간

boost::chrono::hours H2(2); // 2시간

boost::chrono::hours H25(25); // ?

 

boost::chrono::seconds S1(10);

boost::chrono::seconds S2(120);

 

boost::chrono::milliseconds MILS1(100);

 위 코드의 H1이나 S1, MILS1은 문자열이나 숫자로 출력할 수 있습니다.(방법은 제일 아래의 예제 코드를 봐 주세요)

 

또한 이 시간 타입을 서로 연산할 수도 있습니다.

boost::chrono::hours H1(1);

boost::chrono::hours H2(2);

boost::chrono::hours H3 = H1 + H2;

 

물론 다른 시간 타입을 연산할 수도 있습니다

boost::chrono::seconds S1(10);

boost::chrono::milliseconds MILS1(100);

boost::chrono::milliseconds MILS2 = S1 + MILS1;

 

다른 시간 타입을 연산할 때 주의할 점이 있습니다. 아래처럼

boost::chrono::milliseconds MILS2 = S1 + MILS1;

의 경우는 초와 밀리세컨드라는 서로 다른 타입을 더하지만 값을 저장하는 타입이 밀세컨드이기 때문에 읽어버리는 값이 발생하지 않으므로 연산에 문제가 없습니다.

 

그러나 아래와 같이

boost::chrono:: seconds S2 = S1 + MILS1;

로 하는 경우는 밀리세컨드 부분을 잃어버리게 되기 때문에 컴파일 에러를 발생합니다.

이런 경우는 명시적으로 형 변환을 시켜줘야 합니다.

boost::chrono::seconds S2 = boost::chrono::duration_cast< boost::chrono::seconds >(S1 + MILS1);

 


< 예제 >

#include <boost/chrono.hpp>

int main()
{
    {
        boost::chrono::hours H1(1); // 1시간
        boost::chrono::hours H2(2); // 2시간
        boost::chrono::hours H3(25); // ?

        std::cout << "H1(1) - 문자열 : " << H1 << std::endl;
        std::cout << "H1(1) - 숫자로 : " << H1.count() << std::endl;
        std::cout << "H3(25) - 문자열 : " << H3 << std::endl;
        std::cout << "H3(25) - 숫자로 : " << H3.count() << std::endl;


        boost::chrono::seconds S1(10);
        boost::chrono::seconds S2(120);

        std::cout << "S1(10) - 문자열 : " << S1 << std::endl;
        std::cout << "S1(10) - 숫자로 : " << S1.count() << std::endl;

        std::cout << "S2(120) - 문자열 : " << S2 << std::endl;
        std::cout << "S2(120) - 숫자로 : " << S2.count() << std::endl;
    }

    {
        boost::chrono::hours H1(1);
        boost::chrono::hours H2(2);
        boost::chrono::hours H3 = H1 + H2;

        std::cout << "H1 + H2 = : " << H3 << std::endl;


        boost::chrono::seconds S1(10);
        boost::chrono::milliseconds MILS1(100);
        boost::chrono::milliseconds MILS2 = S1 + MILS1;

        std::cout << "S1 + MILS1 = : " << MILS2 << std::endl;


        boost::chrono::seconds S2 = boost::chrono::duration_cast< boost::chrono::seconds >(S1 + MILS1);

        std::cout << "S1 + MILS1 = : " << S2 << std::endl;
    }



    return 0;
}



 

 

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. You are completely right in such kind of technical points!

  2. I was searching for such a guide! It is very much clear to me

Posted by 흥배

chrono는 경과 시간을 계산할 때 다양한 시간 타입으로 계산할 수 있습니다.

이전 회의 예제의 경우는 초 단위로 표시하되 소수점까지 표시할 수 있었습니다.

boost::chrono::duration<double> sec = boost::chrono::system_clock::now() - start;

 

그런데 보통은 소수점이 나오는 결과 값보다는 정수로 나오는 값을 사용하는 경우가 많을 것입니다.

 

chrono에서는 경과 시간을 나타내는 클래스는 duration입니다.

duration 6개의 시간 단위를 지원합니다.

nanoseconds - 10억분의 1

microseconds - 100만분의 1

milliseconds - 1000분의 1

seconds –

minutes -

hours – 시간

 

이전 회의 예제를 사용하여 이번에는 다양한 시간 단위로 경과 시간을 표시해 보겠습니다.

#include <boost/chrono.hpp>

#include <cmath>

 

void Test()

{

           for ( long i = 0; i < 10000000; ++i )

           {

                     std::sqrt( 123.456L );

           }

}

 

int main()

{

    boost::chrono::system_clock::time_point StartTime = boost::chrono::system_clock::now();

                    

    Test();

    boost::chrono::system_clock::time_point EndTime = boost::chrono::system_clock::now();

 

    boost::chrono::duration<double> DefaultSec = EndTime - StartTime;

    boost::chrono::nanoseconds nano = EndTime - StartTime;

    boost::chrono::microseconds micro = boost::chrono::duration_cast<boost::chrono::microseconds>(EndTime - StartTime);

    boost::chrono::milliseconds mill = boost::chrono::duration_cast<boost::chrono::milliseconds>(EndTime - StartTime);

    boost::chrono::seconds sec = boost::chrono::duration_cast<boost::chrono::seconds>(EndTime - StartTime);

    boost::chrono::minutes min = boost::chrono::duration_cast<boost::chrono::minutes>(EndTime - StartTime);

    boost::chrono::hours hour = boost::chrono::duration_cast<boost::chrono::hours>(EndTime - StartTime);

 

    std::cout << "Test() 함수를 수행하는 걸린 시간 : " << DefaultSec.count() << " default" << std::endl;

    std::cout << "Test() 함수를 수행하는 걸린 시간 : " << nano.count() << " nanoseconds" << std::endl;

    std::cout << "Test() 함수를 수행하는 걸린 시간 : " << micro.count() << " microseconds" << std::endl;

    std::cout << "Test() 함수를 수행하는 걸린 시간 : " << mill.count() << " milliseconds" << std::endl;

    std::cout << "Test() 함수를 수행하는 걸린 시간 : " << sec.count() << " seconds" << std::endl;

    std::cout << "Test() 함수를 수행하는 걸린 시간 : " << min.count() << " minutes" << std::endl;

    std::cout << "Test() 함수를 수행하는 걸린 시간 : " << hour.count() << " hour" << std::endl;

                    

    return 0;

}

 

< 결과 >


 


 ps : 네임스페이스를 다 적다보니 코드 가독성이 좀 떨어질텐데 양해바랍니다^^;

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 이 나오는 결과 값보다는 정수로 나오

Posted by 흥배

chrono Boost 라이브러리 1.47에서 새로 생긴 시간 측정 라이브러리입니다.

chrono C++11 STL에 들어갔습니다. 그래서 C++11을 완벽하게 지원하는 컴파일러가 나오지 않은 때라도 Boost 라이브러리를 사용하면 미리 사용해 볼 수 있습니다. 그리고 컴파일러에서 C++11 chrono를 지원한다면 손쉽게 표준으로 바꿀 수 있습니다.

 

chrono를 사용하면 특정 시간 구간에 걸린 시간을 세컨드(), 밀리 세컨드, 나노 세컨드로 얻을 수 있으며 또 시간끼리 연산을 할 수도 있습니다

 

 

chrono 사용 방법

chrono는 시스템 API를 사용하므로 먼저 Boost 라이브러리의 lib 파일이 필요합니다. Boost 라이브러리를 다운로드 받아서 직접 빌드하던가 BoostPro를 통해서 이미 만들어진 lib 파일을 받아서 설치해야 합니다.

 

헤더 파일은

#include <boost/chrono.hpp>

만 추가하면 됩니다.

 

 

chrono를 사용한 성능 측정

프로그램의 성능 측정을 할 때 특정 기능을 시작하기 전에 현재 시간을 저장하고(S1), 그 기능을 다 수행한 후 현재 시간(S2)을 얻어서 S2-S1을 계산하여 걸린 시간을 얻습니다.

이런 기능을 chrono를 사용하여 간단하게 구현해 보겠습니다.

 

< 예제코드 1 >

#include <boost/chrono.hpp>

#include <cmath>

 

void Test()

{

           for ( long i = 0; i < 10000000; ++i )

           {

                     std::sqrt( 123.456L );

           }

}

 

int main()

{

    boost::chrono::system_clock::time_point start = boost::chrono::system_clock::now();

                

    Test();

          

    boost::chrono::duration<double> sec = boost::chrono::system_clock::now() - start;

    std::cout << "Test() 함수를 수행하는 걸린 시간() : " << sec.count() << " seconds" << std::endl;

 

    return 0;

}

 

< 실행 결과 >

 

<예제코드 1>에서는 boost::chrono::system_clock::now()을 사용하여 현재 시간을 얻습니다.

boost::chrono::system_clock::time_point start = boost::chrono::system_clock::now();

여기서 time_point 타입은 시간 상의 한 축을 뜻합니다.

 

이후 Test() 함수를 실행한 후 다시 현재 시간을 얻은 후 Test()를 시작하기 전에 저장한 현지 시간을 빼면 Test()를 수행하는 걸린 시간을 얻을 수 있습니다.

boost::chrono::duration<double> sec = boost::chrono::system_clock::now() - start;

 

이번 회는 이정도로 아주 간단하게 chrono에 대해서 설명하겠습니다. chrono의 더 다양한 기능은 다음 회에 또 설명하겠습니다^^

 

ps) boost::chrono::system_clock::now()에 의해서 얻는 시간의 초기 시간은 1970년 입니다.

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 실질적으로, 기사는이 칭찬할만한 주제에 정말 최고입니다. 당신의 결론에 동의하고 열심히 미래의 업데이 트를 기대합니다. 그냥 당신이 그냥 서면으로 멋진 명석을 위해 충분하지 않습니다 감사합니다라고. 나는 즉시 만족 일과 비즈니스 노력에 많은 성공을 것입니다.

  2. 미래의 업데이 트를 기대합니다. 그냥 당신

Posted by 흥배

혹시 Boost 라이브러리라는 것을 아시나요? 만약 아직 모르고 있었다면 C++ 프로그래머로서 적지 않은 손해를 보고 있다고 생각합니다.^^

Boost 라이브러리는 C++ 프로그래머를 위한 유용한 오픈 소스 C++ 라이브러리 모음입니다. Boost 라이브러리 개발에 수 많은 C++ 고급 프로그래머들이(C++ 표준 위원회 멤버 등) 참여 하고 있습니다. 그래서 Boost 라이브러리는 실용적인 기능과 높은 안정성을 가지고 있습니다.

 

만약 아직까지 Boost 라이브러리를 한번도 사용해 본적이 없다면 바로 사용하기를 권합니다. 그리고 아직도 일부에서는 Boost 라이브러리의 안정성에 대해서 의심하는 분들이 있는데 무의미한 의심은 그만두기를 바랍니다^^

 

C++11에 들어가는 새로운 표준 라이브러리에는 Boost 라이브러리에 있는 것들이 많이 들어갔습니다. 예를 들면 VS 2008 SP를 설치하면 사용할 수 있는 tr1 라이브러리에 있는 대부분이 Boost 라이브러리에 있는 것입니다. 새로운 표준에는 들어갔지만 아직 VC++에서 지원하지 않는 라이브러리도 Boost 라이브러리를 사용하면 미리 사용해볼 수 있습니다.

 

다음에 소개할 chrono Boost 라이브러리에 이미 있습니다. 그러니 Boost 라이브러리를 설치하면 chrono는 바로 사용해 볼 수 있습니다.

 

Boost 라이브러리의 설치와 사용 방법은 구글링을 하면 적지 않게 찾을 수 있습니다. 그 중 몇 개를 제가 찾아 놓았습니다^^

 

 

Boost 라이브러리 홈페이지

http://www.boost.org/

최신 버전은 1.47.0 입니다.

 

 

VC++ 6.0에서 Boost 라이브러리 설치

- 1.33 버전까지만 설치할 수 있습니다

http://blog.naver.com/sorkelf/40132524363

 

 

설치 파일로 설치하기 (VC++ 7.1 ~ VC++ 10까지 지원)

- Boost 라이브러리는 대부분의 기능은 헤더 파일 추가만으로 사용할 수 있지만 일부 기능(thread, filesystem ) lib 파일을 만들어야 합니다. 그러나 설치 파일로 설치하면 이미 빌드된 lib 파일을 얻을 수 있습니다.

http://ncanis.tistory.com/333

 

 

수동으로 설치하기

- 가장 기본 적인 방법으로 직접 lib 파일을 만들어야 합니다. 위의 설치 파일보다 장점은 lib 파일을 빌드할 때 옵션을 마음대로 지정할 수 있고, 특히 가장 최신 버전을 빨리 사용할 수 있습니다.

http://genkino.tistory.com/1446

 

 

Boost 라이브러리 설명

- 몇 년 전에 제가 번역한 것으로 1.33 버전을 기준으로 하고 있습니다. 설명에 부족한 것이 많지만 그런 부분은 구글링을 찾아보시기 바랍니다.

http://jacking75.cafe24.com/Boost/libraries.htm

 

 

Boost 라이브러리 e-book

- 영어라는 단점(?)이 있지만 각 기능을 잘 설명하고 있습니다.

http://en.highscore.de/cpp/boost/

 


꼭 Boost 라이브러리를 설치하고 사용하기를 강력하게 추천합니다

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 가장 기본 적인 방법으로 직접 lib 파일을 만들어야 합니다

Posted by 흥배

unscoped enumeration scoped enumeration

C++11(새로운 C++ 표준의 이름) enum은 지금(C++03)과 다르게 두 가지의 enum이 있습니다.

바로 unscoped enumeration scoped enumeration 입니다.

 

unscoped enumeration은 기존의 enum과 비슷한 것 이라고 생각 하면 되고, scoped enumeration C++11에서 새로 생긴 enum 입니다.

 

unscoped enumeration은 아래와 같이 정의하고 사용합니다.

enum ITEMTYPE : short

{

   WEAPON,

   EQUIPMENT,

   GEM       = 10,

   DEFENSE,  // C++03까지는 에러이지만 C++11에서는 에러가 아님

};

 

사용은 아래와 같이

short ItemType = WEAPON;

또는

short ItemType = ITEMTYPE::WEAPON; // C++03에서는 에러

 

 

scoped enumeration은 아래와 같이 정의하고 사용합니다.

enum class ITEMTYPE : short

{

   WEAPON,

   EQUIPMENT,

   GEM       = 10,

   DEFENSE, 

}

 

사용은 아래와 같이 합니다.

short ItemType = ITEMTYPE::WEAPON;

그러나 아래는 에러입니다.

short ItemType = WEAPON;  // 에러

 

scoped enumeration unscoped enumeration와 다르게 ITEMTYPE를 생략하면 안됩니다. WEAPON이나 GEM ITEMTYPE의 범위 안에 있음을 가리킵니다.

그리고 enum class 대신 enum struct을 사용해도 괜찮습니다. 또 타입을 지정하지 않으면 기본으로 int 타입이 됩니다.

 

 

 

전방 선언

unscoped enumeration scoped enumeration 둘 다 전방 선언을 할 수 있습니다.

 

아래와 같이합니다.

enum ITEMTYPE : short;

enum class ITEMTYPE : short;

 

전방 선언을 할 때 unscoped enumeration은 타입 선언을 생략할 수 없지만 scoped enumeration은 타입 선언을 생략 할 수 있습니다.

 

 

 

형 변환

unscoped enumeration은 기존과 같이 암묵적으로 정수로 변환할 수 있습니다.

int i = WEAPON;

그러나 scoped enumeration은 명시적으로 타입 캐스팅을 해야합니다.

int i = static_cast<int>(ITEMTYPE::WEAPON);

 

 

 


참고

http://d.hatena.ne.jp/spinor/20110918/1316321563

 


저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 실질적으로, 기사는이 칭찬할만한 주제에 정말 최고입니다. 당신의 결론에 동의하고 열심히 미래의 업데이 트를 기대합니다. 그냥 당신이 그냥 서면으로 멋진 명석을 위해 충분하지 않습니다 감사합니다라고. 나는 즉시 만족 일과 비즈니스 노력에 많은 성공을 것입니다.

  2. 래의 업데이 트를 기대합니다. 그냥 당신

  3. 대법원은 그중 이미 중요한 부분 및 마케팅 전략의 주요 기반 중 하나가 발생했습니다. 현재, 사람들은 옵션의 충분한로 취급되었다. 인터넷을 통해 선택은 다시 성장하고있다.

  4. 경험을 바탕으로 좋은 홍보 자료가 너무 좋은 판매량을 높일 것입니다. 당신은 나쁜 판촉물 경우, 즉시 변경합니다. 기업의 많은이 새로운 사업을 구축할 오래 생각해야하지만, 뒤얽힌 때 판촉 비용이 없습니다.

  5. 기존 고객 유지는 새로운 고객을 찾는 데보다 훨씬 저렴합니다. 성공적인 비즈니스는 고객과의 관계를 구축하기 위해 노력 시작해야합니다.

  6. 이메일 마케팅은 회사와 클라이언트 간의 관계의 모든 측면을 측정할 수있는 유일한 기회입니다. 이메일 마케팅은 중요한 벡터 생성 웹 트래픽입니다. 판촉 모델의 상단 목록에서 많은 마케팅 이메일 마케팅 장소. 사용하는 전자 메일 마케팅 무게 그룹이 직접적인 마케팅 캠페인을 이동됩니다 찾는 정확하게 구성되어 있습니다.

Posted by 흥배

constexpr를 클래스에 사용


constexpr을 클래스에서 사용하면 클래스를 정수로 사용할 수도 있으며 메타 템플릿 프로그래밍에서는 이전에는 복잡하게 처리하던 것을 아주 간단하게 처리할 수도 있습니다. C++ 메타 템플릿 프로그래밍에 관심이 많구나 자주 사용하고 있는 분들에게는 constexpr 덕분에 프로그래밍이 한결 편해지리라 생각합니다.

 

아래의 코드는 Integer 이라는 클래스를 constexpr을 사용하여 정수처럼 사용 합니다.

class Integer

{

private :

    int value ;

 

public :

    constexpr Integer() : value() { }

    constexpr Integer( int value ) : value(value) { }

 

    constexpr operator int() { return value ; }

} ;

 

int main()

{

    constexpr Integer size = 5 ; // 컴파일 타임에 정수로

 

    int x[size] ; // Integer::operator int()가 호출된다

 

    Integer object ; // 일반적인 클래스 인스턴스 화. 실행 시에 처리

    int y[object] ; // 당근 에러

}

출처 : http://cpplover.blogspot.com/2010/11/gccniconstexpr.html

 


또 메타 템플릿 프로그래밍에서는 아래와 같이 사용할 수도 있습니다.

#include <iostream>

 

struct pi {

    static constexpr double value = 3.14;

};

 

template <const double& r>

struct circle_area {

    static constexpr double value = r * r * pi::value;

};

 

struct radius {

    static constexpr double value = 2.5;

};

 

int main()

{

    constexpr double result = circle_area<radius::value>::value;

 

    static_assert(result == 19.625, "not equal");

    std::cout << result << std::endl;

}

출처 : http://d.hatena.ne.jp/faith_and_brave/searchdiary?word=constexpr&.submit=%B8%A1%BA%F7&type=detail

 

 

constexpr은 컴파일 할 때 결과가 이미 결정 나는 것은 컴파일 타임 때 처리를 해주어 실행 시에 불필요한 처리를 막아주고, 기존의 메타 템플릿 프로그래밍으로 까다롭게 만들었던 것을 아주 쉽게 구현할 수 있게 해줍니다.

 

C++11에서는 constexpr을 잘 사용하면 기존 보다 더 뛰어난 프로그래밍을 할 수 있으니 깊게 파고들 가치가 있다고 생각합니다.

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 일 할 때 결과가 이미 결정 나는 것은 컴파일 타임 때 처

Posted by 흥배

constexpr는 변수, 함수, 클래스를 컴파일 타임에 정수로 사용할 수 있도록 해줍니다. 즉 상수로 취급할 수 있는 작업은 컴파일 타임에 처리하도록 할 수 있습니다.

 

constexpr를 변수에 사용

constexpr int aa = 11;

이것은

const int aa = 11

와 같은 의미를 가집니다.

 

그러나 아래와 같이는 사용할 수 없습니다.

int input_num = 0;

constexpr int aa = input_num;  // 에러


constexpr
로 지정된 변수는 꼭 컴파일 시에 정수가 되기 때문에 변수 선언 시 대입이 정수 식이어야만 합니다. const와의 차이는 const는 컴파일 시에 정수가 아니어도 괜찮고 변수 선언 시 대입 값이 정수 식인 경우 정수 식이 되고, 그렇지 않은 경우는 단순히 const를 수식하는 것이 됩니다(이에 비해 constexpr는 꼭 정수 식이어야만 합니다).

 

 

 

constexpr를 함수에 사용

C++03에서는 아래의 코드는 에러가 됩니다.

int GetNum() { retun 5; }

int Numbers[ GetNum() ];

GetNum 함수는 상수 5를 반환 하는 것으로 이미 컴파일 시에 반환 값을 알 수 있습니다. 그러나 컴파일러는 GetNum 이라는 함수가 정수처럼 사용할 수 있는지 알 수 없으므로 정수로 취급하지 않습니다.

 

위 코드는 C++11constexpr를 사용하면 우리가 원하는 대로 GetNum 함수를 정수로 사용할 수 있습니다.

 

constexpr int GetNum() { retun 5; }

int Numbers[ GetNum() ];

 

constexpr를 함수에 사용할 때는 꼭 함수 본체는 { return expression; } 형태가 되어야만 합니다.

 

 

constexpr 변수는 비 constexpr 변수에 사용할 수 있으므로 아래와 같은 테크닉도 사용할 수 있다.

constexpr double power( double x, unsigned int y )

{

    return y == 1 ? x : x * power( x, y - 1 ) ;

}

 

int main()

{

    // 정수 식

    constexpr double a = power( 2, 32 ) ;

 

    // 정수 식이 아니다

    double x = 2 ; unsigned int y = 32 ;

    double b = power( x, y ) ;

}

(출처) http://cpplover.blogspot.com/2010/11/gccniconstexpr.html

 

 

그리고

const int base_HP = 200;

int NPC_Lv1_HP = base_HP + 0;

int NPC_Lv2_HP = base_HP + 200;

라는 코드는 정수 계산을 하는데 실행 시에 계산되는데 이것을 constexpr을 사용하여 컴파일 시에 계산되게 할 수 있습니다.

 

constexpr int AssignHP( int nPlusHP )

{

 return base_HP + nPlusHP;

}

 

int NPC_Lv1_HP = AssignHP( 0 );

int NPC_Lv2_HP = AssignHP( 200 );



 

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 시에 정수가 되기 때문에 변수 선언 시 대입이 정

Posted by 흥배

현재의 표준 C++에서는 부모 클래스의 특정 멤버를 오버라이드 할 때 virtual을 앞에 붙입니다.

struct Base

{

  virtual void foo( int i );

};

 

struct Derived : Base

{

  virtual void foo( int i );

}

 위의 예제와 같은 작은 코드를 만질 때는 실수를 하지 않지만 실제 일을 할 때는 크고 많은 클래스를 다루다 보면 실수를 할 수 있습니다. 위 예제의 경우 아래와 같은 실수를 할 수 있습니다.

struct Derived : Base

{

  virtual void foo( float i );

}

위와 같이 실수를 하면 Derived의 foo 멤버함수는 Base foo 멤버함수를 오버라이드 하지 않게 됩니다. 이런 실수는 에러가 아니기 때문에 골치 아픈 삽질을 할 수도 있습니다.

이런 문제를 방지하기 위해서 override가 새로 생겼습니다.

struct Derived : Base

{

  virtual void foo( float i ) override;

}

이렇게 override를 사용하게 되면 컴파일 할 때 Base 클래스에

void foo( float i )가 없는데 오버라이드 한다고 에러를 발생시켜 줍니다.

 

 

때로는 Base 클래스의 특정 멤버함수를 Derived 클래스에서 오버라이드 하지 못하도록 막고 싶은 경우가 있을 것입니다. 이때는 final을 사용합니다.

struct Base

{

  virtual void foo( int i ) final;

};

 

struct Derived : Base

{

  virtual void foo( int i );

}

위의 코드에서는 Base 클래스의 foo 멤버함수를 final로 오버라이드 못하도록 해 놓았기 때문에 컴파일을 하면 에러가 발생합니다.

 

 

 

참고

위키피디아 http://en.wikipedia.org/wiki/C%2B%2B0x

 

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. final 저건 맘에 드네요. 지금까진 따로 __final___ 이라고 define 해서 썼는데. JAVA를 아는 사람이면 알아보리라는 기대감과 함께...

    근데 override 에서 virtual 키워드의 설명은 귀찮아서 대강 적으신듯. virtual 을 안써도 override 의 개념이긴 한데, 하긴 virtual 을 간단히 설명하기가 좀 애매하군요.

  2. override가 c++11에서 표준이 된건가요?

    기존에 vs2008에서 MS가 제공해주는 키워드인걸로 알고 있어서
    보기도 편하고 실수를 줄일수있어서 사용하던건데.....

    표준이 된거라면 환영~^^

  3. final 은 sealed 와 다른건가요?

    • 제가 알기로 sealed는 주로 자바와 C#에서 사용하는 것으로 알고 있는데 sealed는 다른 클래스가 이 클래스를 상속 하지 못하게 하는 것이고, final은 부모 클래스의 특정 멤버함수를 오버라이드 하지 못하게 하는 것입니다.

  4. 보기도 편하고 실수를 줄일수있어서 사

  5. 참조은 당신의 서비스 또는 제품을 사용할 수있을 그가 아는​​ 사람을 걱정하는 고객을 청할 때가 아닌 다른 누구도 없었다. 이 참조의 주요 아이디어는 사람이 참조된 연락을하는 것입니다.

  6. 허가 기반의 마케팅은 온라인 커뮤니케이 션에 추진 새 규칙이며, 당신이 말한 것을 관심을 자신의 중심에 따라 회사에서 상업용 전자 메일을 수신 안내서를 얻어 기반으로합니다.

  7. 어머니 또는 아버지는 젊은이의 필요성을 제공합니다.아이의 필요성은 시간이 지남에 많은 지네요. 그들은 모두 현금으로 준비한다.

  8. 모든 부모는 아이에게 장점을 제공합니다. 당신의 아이들은 최고의 수신을 직접 특정을 가지고. 젊은이를위한 가장 좋은 고가 하나의 특정 아닙니다.

  9. 부모는 아이들의 필요를 제공할 것입니다.아이들의 필요 년까지 많은 년을 받고있다. 그들은 돈으로 준비를해야합니다.

Posted by 흥배
앞으로 조금씩이라도 꾸준히 C++11에 새로 추가되는 기능들을 간단하게 소개하려고 합니다.
새로운 라이브러리의 경우 boost 라이브러리에 있는 것은 boost 라이브러리를 통해서 예제와 같이
좀더 자세하게 설명하고 그렇지 못한 것들은 간단한 설명과 코드로만 설명하려고 합니다.

C++ 프로그래머에게 새로운 C++ 표준은 먼 미래의 것이 아닙니다. 지금부터 조금씩 공부해보죠^^
(개인적으로 예전에 STL의 경우를 보면 앞으로 C++11을 아는 C++ 프로그래머와 모르는 프로그래머로 나누어지지 않을까 생각합니다)



현재의 C++에서는 두 가지 종류의 문자형을 지원하고 있습니다. char wchar_t 입니다.

char szName[] = “jacking”;

wchar_t szName2[] = L”jacking”;

 

그러나 C++0x에서는 유니코드를 강력하게 지원하기 위해 새로운 문자형이 추가 됩니다.

 

 

 

UTF-8

UTF-8을 사용하는 문자형은 따로 없고 기존의 char를 사용합니다.

char szName[] = u8”jacking”;

문자열 리터럴(literal) 앞에 u8을 붙입니다.

 

 

UTF-16

UTF-16을 사용하는 문자형 변수를 선언할 때는 char_16t를 사용합니다.

char16_t szName3[] = u”jacking”;

문자열 리터럴 앞에 u를 붙입니다.

 

 

UTF-32

UTF-32을 사용하는 문자형 변수를 선언할 때는 char_32t를 사용합니다.

char32_t szName4[] = U”jacking”;

문자열 리터럴 앞에 U를 붙입니다.



저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. icartsh@gmail.com 2011/08/22 17:05

    vs2010에서 아직은 위의 내용을 사용해 볼수는 없는건가요..?

    • 흥배 2011/08/23 16:36

      vs2010에서는 불가능하며 차기 버전에서 C++11을 지원해야만 사용할 수 있습니다

  2. serivires@gmail.com 2011/08/23 08:28

    VS2010에서는 언제쯤 사용가능할까요?

    • 흥배 2011/08/23 16:37

      vs2010에서는 불가능하며 차기 버전에서 C++11을 지원해야만 사용할 수 있습니다. 개인적인 생각으로 빠르면 VC++11(다음 VC++ 버전)이나 아니면 VC++11의 서비스팩을 통해서 지원되지 않을까 생각합니다.

  3. 기존의 L"" prefix 처럼 u8 을 붙이면 소스 파일 인코딩과는 상관없이 컴파일러가 인코딩 전환을 해주는 기능이라고 이해하면 되는거죠?

  4. UTF-16 이나 32는 변수 타입이 달라서 잘 구분이 되는데 UTF-8은 기존 그대로 char 를 쓰니 헷갈릴 일이 많을 것 같네요. 웬만하면 UTF-16 을 쓰는게 나을 것 같다는 생각이 듭니다.

  5. 헷갈릴 일이 많을 것 같네요. 웬

Posted by 흥배

STL의 컨테이너를 사용해보았다면 forward_list라고 해서 딱히 어려운 부분은 없습니다. 다만 forward_list이 단 방향 리스트라는 것과 다른 컨테이너에서는 지원하는 기능이 일부 없다는 것을 잘 숙지해야 합니다.

 

필요한 헤더 파일

forward_list는 이름과 같은 ‘forward_list’라는 헤더 파일을 포함해야 합니다.

#include <forward_list>

 

 

[예제] forward_list를 사용하여 요소 추가, 순회, 삭제하기

#include "stdafx.h"

#include <iostream>

#include <forward_list>

 

using namespace std;

 

 

int main()

{

           forward_list< int > flist;

 

 

           cout << "flist에 추가한 요소들 출력" << endl;

           // 추가하기

           auto iter = flist.before_begin();

           for( int i = 0; i < 5; ++i )

           {

                     iter = flist.insert_after( iter, i );

           }

                    

           // 순회

           for( iter = flist.begin(); iter != flist.end(); ++iter )

           {

                     cout << *iter << endl;

           }

 

           cout << endl;

           cout << "flist의 요소들 중 일부를 삭제한 후 남은 요소들 출력" << endl;

           // 순회 하면서 일부 요소 삭제

           auto prev_iter = flist.before_begin();

           iter = flist.begin();

           while( iter != flist.end() )

           {

                     if( 3 == *iter )

                     {

                                iter = flist.erase_after( prev_iter );

                                continue;

                     }

                     ++prev_iter;

                     ++iter;

           }

 

           // 순회

           for( iter = flist.begin(); iter != flist.end(); ++iter )

           {

                     cout << *iter << endl;

           }

 

           return 0;

}

 

< 결과 >


 

위 예제를 보면 아시겠지만 forward_list std::list에 비해 성능 면의 이점을 가지고 있지만 사용 측면에서는 조금 불편한 점이 좀 있습니다. 그러나 C와 비슷한 성능을 내고 싶은 경우에는 좋은 선택 기가 될 수도 있습니다.

 


참고

http://msdn.microsoft.com/ko-kr/library/ee373568.aspx

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!


  2. 사람들이 정말 인상되는 색상을 사용하는 송장을 기억하고 읽을 수있는 정도 효과되지 않습니다 또 다른 방법입니다. 인보이스는 녹색 종이에 보냈습니다. 모두가 녹색 송장의 템포를 기억하기 때문에 우리가 통과 법안을 추구했을 때 실제로 얼음을 깰.

  3. 당신을 구입 아니라 이름에 투자하는 사람들에게 이점을 제공합니다. 그것은 저렴 방법, 개인 서비스의. 제공하는 서비스는, 심지어 가장 큰 대부분의 인터넷 기업을 통해 이점 것입니다.

Posted by 흥배

앞에까지는 STL의 알고리즘에 추가된 것들을 다루었는데 이번에는 컨테이너 하나를 소개하겠습니다. 사실 이 컨테이너는 저도 얼마 전까지만 하더라도 새로 추가 된지 몰랐습니다.^^;

 

새로 추가된 컨테이너의 이름은 forward_list입니다.

이름을 들어보니 대충 어떤 컨테이너인지 감이 오시죠?^^ 네 이 컨테이너는 기존의 list 컨테이너와 비슷한 종류의 컨테이너입니다.

 

 

forward_list를 만든 이유

표준 라이브러리(STL)에는 이미 리스트(std::list) 라이브러리가 있습니다. 이것은 쌍 방향 리스트입니다. list는 사용하기는 편하지만 사용 메모리나 처리 속도에 조금 아쉬운 점이 있습니다. 또 대 부분의 상황에서 쌍 방향 리스트가 필요한 경우보다는 단 방향 리스트만으로 충분한 경우가 자주 있습니다. 이런 이유로 C++0x에서는 단 방향 리스트를 추가하기로 했습니다.

 

 

forward_list의 설계 방침

1. 특별한 이유가 없다면 forward_list는 기존의 list의 설계에 맞춘다.

2. 설계 상의 선택 기가 여러 개인 경우 성능(속도와 사이즈)을 최우선 한다(C의 구조체로 구현하는 경우와 비교하여 Zero Overhead로 한다).

3. std::list insert eraseforward_list에서도 제공할 수 있지만 구현이 복잡해지고 성능 측면에서 좋지 않으므로 제공하지 않는다.

4. 다른 STL의 컨테이너들에 있는 size 함수를 제공하지 않는다. 이유는 요소 수를 보존하는 멤버를가지고 있으면 C언어에서 구현한 것과 비교해서 불필요한 메모리를 사용한다. 만약 이런 멤버를 가지고 있지 않으면서 size 함수를 지원하면 호출할 때마다 모든 요소를 세어야 하므로 계산량이 O(N)이 된다(그런데 유저는 다른 컨테이너와 같이 size의 계산량이 작을 것이라고 생각할 수 있다). 또 이미 unordered와 같은 연상 컨테이너도 기존의 요소를 만족하지 않고 있다.

 

 

STL list 컨테이너와 다른 점

forward_list는 기존의 list와 아래와 같은 점이 다릅니다.

1. forward_list는 단 방향 리스트(singly-linked-list)이다. 각 요소는 그 다음 요소를 가리키는 포인터를 하나만 가지고 있다(list은 양 방향 리스트).

2. (단 방향 리스트이므로) list에 비해서 메모리를 작게 사용한다. 이것은 각 요소의 메모리만이 아닌 컨테이너 그 자체의 사이즈도 작다. int 형에 대해서 list 12바이트라면 forward_list 8바이트이다(64비트에서는 각각 24, 16).

3. list에 비해 삽입/삭제 속도가 더 빠르지만 그 차이는 크지는 않다

4. 한 방향으로만 이동할 수 있다.

5. 삽입과 삭제는 지정한 요소의 다음 요소만 가능하다.

 

 

forward_list의 멤버 리스트

기능

멤버

대입

assign

반복자

befor_begin

 

cbefore_begin

 

begin

 

end

 

cbegin

 

cend

비었는지 조사

empty

현재 크기(size)

지원 안함

사이즈 변경

resize

모두 삭제

clear

선두에 추가

push_front

선두 요소 삭제

pop_front

선두 요소 참조

front

삽입

insert_after

삭제

erase_after

조건 삭제

remove

 

remove_if

중복 요소 삭제

unique

교환

swap

병합

merge

정렬

sort

반전

reverse

 

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 성능에 안 좋은 걸 아예 못 쓰게 만든 의미가 크군요 ㅋㅋ

  2. 너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!

  3. 긍정적인 사람들과 함께 생활을 입력하고 부정적인 모든 것을 버린다. 당신이 뭘하고 마음에 들지 않으면, 당신이 그것 시는지 사업 변경 계획을합니다. 당신이 뭘 사랑하면 그 결과는 엄청난 것입니다.

  4. 도메인 이름, 제목, 제품 이름, 기억하기 쉬운 것을 사용합니다. 많은 분야는 단어를 유인하기 위해 몇 가지 트릭을 사용합니다. 당신이 올바른 URL을 찾지 않는 그들은 항상 직접 액세스할 수 없습니다.

Posted by 흥배

C++03까지의 STL에는 데이터셋에서 가장 작은 요소를 찾을 때는 min_element, 가장 큰 요소를 찾을 때는 max_element를 사용하였습니다.

그런데 만약 최소와 최대를 동시에 찾을 때는 어쩔 수 없이 min_element max_element를 각각 호출해야 하는 불필요한 불편한 점이 있었습니다.

 

C++0x에서는 이런 불편함을 개선하기 위해 한번에 최소와 최고를 찾아주는 minmax_element 알고리즘이 새로 생겼습니다.

 

 

minmax_element

template<class ForwardIterator>

    pair< ForwardIterator, ForwardIterator >

        minmax_element( ForwardIterator _First, ForwardIterator _Last );

template<class ForwardIterator, class BinaryPredicate>

    pair< ForwardIterator, ForwardIterator >

        minmax_element( ForwardIterator _First, ForwardIterator _Last, BinaryPredicate _Comp );

 

minmax_element 알고리즘에는 조건자를 사용하는 버전과 조건자를 사용하지 않은 버전 두 가지가 있습니다. 데이터셋의 자료형이 유저 정의형(class struct를 사용한)이라면 조건자가 있는 버전을 사용합니다.

 

< 예제 코드 >

#include <iostream>

#include <algorithm>

using namespace std;

 

 

int main()

{

           int Numbers[10] = { 50, 25, 20, 7, 15, 7, 10, 2, 1, 3 };

          

           pair<int*, int*> MinMaxValue = minmax_element( &Numbers[0], &Numbers[10] );

 

           cout << "최소 값 : " << *MinMaxValue.first << endl;

           cout << "최대 값 : " << *MinMaxValue.second << endl;

          

           return 0;

}

 

< 결과 >


 

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!

  2. 사업은 문을 열고 고객이 오기를 기다리는 것입니다. 그들의 시간과 돈을 낭비 생각하기 때문에 그들은 광고하지 않습니다. 그들은 하루 통과로 환멸이 갈수록 나빠지고 시작하므로 고객은 노크 오지 않았다.

  3. 브랜드는 기업의 내부 및 외부 커뮤니케이 션을 나타내야합니다. 직원의 언어와 태도는 자선 브랜드와 목표를 거울 있는지 확인합니다.마크는 회사가 추진하고 모든 자료에 표시해야합니다.

Posted by 흥배

데이터셋을 시퀸스(연속적인)한 값으로 채우고 싶을 때는 iota 알고리즘을 사용합니다.

앞서 소개한 알고리즘들은 <algorithm> 헤더 파일에 정의 되어 있는 것에 반해 iota 알고리즘은 <numeric> 헤더 파일에 정의 되어 있습니다.

 

itoa

template<class ForwardIterator, class T>

  void iota(ForwardIterator first, ForwardIterator last, T value);

 

 

아래는 예제 코드와 결과 입니다.

#include <iostream>

#include <vector>

#include <numeric>

using namespace std;

 

int main()

{

           vector<int> Numberlist;

           Numberlist.push_back( 2 );

           Numberlist.push_back( 5 );

           Numberlist.push_back( 7 );

           iota( Numberlist.begin(), Numberlist.end(), 2 );

 

           for( auto IterPos = Numberlist.begin(); IterPos != Numberlist.end(); ++IterPos )

           {

                     cout << *IterPos << endl;

           }

 

           return 0;

}

 

< 결과 >

 

위 예제를 보면 아시겠지만 iota의 세 번째 인자의 값이 시작 값이고, 이후에 값이 하나씩 증가합니다.

 

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!

Posted by 흥배

is_heap is_heap_until는 앞서 소개했던 is_sorted, is_sorted_until과 비슷한 알고리즘입니다. 차이가 있다면 is_heap is_heap_until는 정렬이 아닌 Heap을 다룬다는 것만 다릅니다.

 

is_heap은 데이터셋이 Heap으로 되어 있는지 아닌지, is_heap_until는 데이터셋에서 Heap이 아닌 요소의 첫 번째 위치를 반환합니다.

 

is_heap

template<class RandomAccessIterator>

    bool is_heap(

        RandomAccessIterator _First,

        RandomAccessIterator _Last

    );

template<class RandomAccessIterator, class BinaryPredicate>

    bool is_heap(

        RandomAccessIterator _First,

        RandomAccessIterator _Last,

        BinaryPredicate _Comp

    ); 

 

 

is_heap_until

template<class RandomAccessIterator>

    bool is_heap_until(

        RandomAccessIterator _First,

        RandomAccessIterator _Last

);

template<class RandomAccessIterator, class BinaryPredicate>

    bool is_heap_until(

        RandomAccessIterator _First,

        RandomAccessIterator _Last,

        BinaryPredicate _Comp

);

 

 

is_heap is_heap_until는 각각 조건자를 사용하는 버전과 사용하지 않는 버전 두 개가 있습니다. 조건자를 사용하지 않는 경우는 operator< 를 사용합니다.

 

 

그럼 is_heap is_heap_until을 사용한 아주 간단한 예제 코드를 봐 주세요^^

#include <iostream>

#include <algorithm>

using namespace std;

 

 

int main()

{

           int Numbers1[10] = { 50, 25, 20, 7, 15, 7, 10, 2, 1, 3 };

           int Numbers2[10] = { 50, 25, 20, 7, 15, 7, 10, 6, 11, 3 };

           int Numbers3[10] = { 50, 25, 20, 7, 15, 16, 12, 3, 6, 11 };

          

          

           bool IsResult = false;

           IsResult = is_heap( &Numbers1[0], &Numbers1[10], [](int x, int y) { return x < y; } );

           cout << "Numbers1 Heap인가 ? " << IsResult << endl;

 

           IsResult = is_heap( &Numbers2[0], &Numbers2[10], [](int x, int y) { return x < y; } );

           cout << "Numbers2 Heap인가 ? " << IsResult << endl;

 

           IsResult = is_heap( &Numbers3[0], &Numbers3[10] );

           cout << "Numbers3 Heap인가 ? " << IsResult << endl;

 

           cout << endl;

           int* NumIter = is_heap_until( &Numbers2[0], &Numbers2[10], [](int x, int y) { return x < y; } );

           cout << "Numbers2에서 Heap되지 않은 첫 번째 위치의 값 : " << *NumIter << endl;

 

           return 0;

}

 

< 결과 >

 

 

 

ps : 자료구조 Heap에 대해서 잘 모르시는 분들은 아래의 글을 참고해 주세요

http://blog.naver.com/ctpoyou/105423523


저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 죽은 indited 컨텐츠 자료, 엔트로피 주셔서 감사합니다. "당신은 믿음을 거의 할 수 있지만, 당신은 그것없이는 아무것도 할 수 없다." 새뮤얼 버틀러에 의해.

  2. 보드 사업 조각하기 전에 주위를 이동하고 보드를 끌어하려고 시도하는 등 사업을 알 수 있습니다. 사무실, 상점 또는 귀하의 비즈니스에 더 많은 보드가 잠재 고객을 유치할 수 있도록하는 방법을 결정하기 위해 경쟁 업체의 공장을 방문하십시오.

  3. 좋은 브랜드는 스폰서 능력과 조직의 전문성의 깨끗한 이미지를 강조 제출하여야한다. 개발과 브랜드 가치를 홍보하는 것은 덜 알려진 자선 단체와 함께 중소 기업의 손해에, 네 편이 고객을 유치할 수 있습니다.

Posted by 흥배

is_sorted는 데이터셋이(컨테이너나 배열) 정렬되어 있다면 true를 반환하고, 그렇지 않다면 false를 반환 합니다.

is_sorted_until는 데이터셋에서 정렬되어 있지 않는 요소의 첫 번째 위치를 반환합니다.

 

is_sortedis_sorted_until의 원형은 아래와 같습니다.

is_sorted

template<class ForwardIterator>

    bool is_sorted( ForwardIterator _First, ForwardIterator _Last );


template<class ForwardIterator, class BinaryPredicate>

    bool is_sorted( ForwardIterator _First, ForwardIterator _Last, BinaryPredicate _Comp );

 

 

is_sorted_until

template<class ForwardIterator>

    ForwardIterator is_sorted_until( ForwardIterator _First, ForwardIterator _Last);

 

template<class ForwardIterator, class BinaryPredicate>

    ForwardIterator is_sorted_until( ForwardIterator _First, ForwardIterator _Last,

               BinaryPredicate _Comp );

 

위의 is_sortedis_sorted_until의 원형을 보시면 알겠지만 조건자(함수객체)를 사용하는 버전과 사용하지 않는 버전 두 가지가 있습니다.

조건자를 사용하지 않는 경우 기본으로 operator<가 적용됩니다.

 

프로그래머는 코드로 이해하죠? ^^ 그럼 바로 예제 코드 들어갑니다.

이번 예제는 간단하게 만들기 위해 정수 배열을 사용해 보았습니다. 아마 STL을 이제 막 공부하고 있는 분들은 알고리즘을 STL의 컨테이너에만 사용할 수 있는 것으로 알고 있는 분들도 있을텐데 그렇지 않습니다. 아래 예제는 int 형 배열을 사용하였습니다.

 

< 예제 코드 >

#include <iostream>

#include <algorithm>

using namespace std;

 

 

int main()

{

           int Numbers1[5] = { 1, 2, 3, 4, 5 };

           int Numbers2[5] = { 5, 4, 3, 2, 1 };

           int Numbers3[5] = { 1, 2, 4, 3, 5 };

           bool IsResult = false;

 

          

           IsResult = is_sorted( &Numbers1[0], &Numbers1[5], [](int x, int y) { return x < y; } );

           cout << "Numbers1. 오름 차순 ? " << IsResult << endl;

 

           IsResult = is_sorted( &Numbers2[0], &Numbers2[5], [](int x, int y) { return x > y; } );

           cout << "Numbers2. 내림 차순 ? " << IsResult << endl;

 

           IsResult = is_sorted( &Numbers3[0], &Numbers3[5], [](int x, int y) { return x < y; } );

           cout << "Numbers3. 오름 차순 ? " << IsResult << endl;

 

           cout << endl;

           cout << "is_sorted에서 조건자(함수객체)를 생략한 경우 " << IsResult << endl;

           IsResult = is_sorted( &Numbers1[0], &Numbers1[5] );

           cout << "Numbers1 is_sorted의 결과는 ? " << IsResult << endl;

           IsResult = is_sorted( &Numbers2[0], &Numbers2[5] );

           cout << "Numbers2 is_sorted의 결과는 ? " << IsResult << endl;

 

           cout << endl;

           int Numbers4[8] = { 1, 2, 3, 5, 4, 5, 7, 8 };

           int* NumIter = is_sorted_until( &Numbers4[0], &Numbers4[5], [](int x, int y) { return x < y; } );

           cout << "Numbers4에서 정렬되지 않은 첫 번째 위치의 값 : " << *NumIter << endl;

 

           return 0;

}

 

< 결과 >


 

 

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 정보 주셔서 감사합니다.

  2. 너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!

  3. 이 규정을 준수하지만, 귀하의 비즈니스에 허용위원회 만들 수 있습니다. 귀하의 비즈니스와 IT가 열려 시간을 설명 너무 사람이 많아, 몇 가지 단어를 사용하지 마십시오. 눈에 띄는 색상을 만들고 맞춤법이나 문법을 발생하지 세부 사항을 확인하십시오.

  4. 결정하기 위해 마케팅 조사의 정보를 사용하여, 예를 들어, 시장 점유율, 효율성 촉진 정책, 귀하의 제품과 서비스에 반응.

Posted by 흥배

제가 http://vsts2010.tistory.com/category/C++/CLI 에 올린 글을 정리한 것으로 보기 편하도록 정리하여 pdf 파일로 만들었습니다.

이후 관련 글을 포스팅 하면 일정 시간이 지난 후 다시 이 글에도 추가하여 배포할 예정입니다.





저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 좋은 자료 감사합니다. ^^

  2. 감사합니다. 흥배님 덕분에 많이 배웠습니다.

  3. 너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!

  4. 새로운 아이디어와 혁신에 마음을 여십시오. 자신의 단어 겁쟁이 말하는 찾아내는 경우에, 기회는 열려 딱딱한 아니라입니다. 아이디어는 돈이 많은 친구 또는 직원이 당신이 그들의 아이디어를 받아들이려고하지 않는 생각을 염두에두고 있습니다 인쇄할 수 있습니다.

  5. 마케팅 조사는 매출과 이익에 영향을 미치지 시장 동향의 식별을 포함합니다. 마케팅 조사는 일반적인 지식보다 훨씬 더 많은 정보를 제공합니다.

  6. C++/CLI가 필요해서 보기만 하다가 감사하다는 말은 해야할거 같아서 글을 썼어요...

Posted by 흥배

이번에 설명할 is_partitioned, partition_point는 그 이름처럼 앞서 소개한 partition_copy와 관계가 있는 알고리즘 입니다.

 

is_partitioned의 원형

template<class InputIterator, class BinaryPredicate>

    bool is_partitioned(

        InputIterator _First,

        InputIterator _Last,

        BinaryPredicate _Comp

    );

 

partition_point의 원형

template<class ForwardIterator, class Predicate>

    ForwardIterator partition_point(

        ForwardIterator _First,

        ForwardIterator _Last,

        Predicate _Comp

    );

 

is_partitioned는 데이터셋의 요소가 전반 부와 후반 부 두 개로 나누어져 있는지 조사할 때 사용하고, partition_point는 두 개로 나누어져 있는 데이터셋에서 후반 부의 첫 번째 요소를 가리키는 반복자를 반환합니다.

 

약간 설명이 애매하죠?^^;

예를 들어 설명하면 온라인 FPS 게임에서 8명이 각각 4명씩 레드 팀과 블루 팀으로 나누어서 게임을 하는 경우 vector로 된 StagePlayers(온라인 게임에서 방에 들어온 유저들을 저장)에 앞 부분에는 레드 팀 플레이어 4명을 차례로 저장하고, 그 이후에 블루 팀 플레이어를 저장하고 있는지 조사하고 싶을 때 is_partitioned 알고리즘을 사용하면 알 수 있습니다(맞다면 true를 반환합니다). 그리고 StagePlayers에서 블루 팀의 첫 번째 플레이어에 접근하고 싶다면 partition_point를 사용합니다.  


나름 쉽게 설명한다고 했는데 이해 가시나요? 만약 이해가 안 간다면 예제 코드를 봐 주세요^^

 

< 예제 >

#include <iostream>

#include <algorithm>

#include <vector>

#include <list>

using namespace std;

 

struct PLAYER

{

           int CharCD;

           bool IsRedTeam;

};

 

 

int main()

{

           vector< PLAYER > StagePlayers1;

           PLAYER player1; player1.CharCD = 1;         player1.IsRedTeam = true;           StagePlayers1.push_back( player1 );

           PLAYER player2; player2.CharCD = 2;         player2.IsRedTeam = true;           StagePlayers1.push_back( player2 );

           PLAYER player3; player3.CharCD = 3;         player3.IsRedTeam = true;           StagePlayers1.push_back( player3 );

           PLAYER player4; player4.CharCD = 4;         player4.IsRedTeam = false;                      StagePlayers1.push_back( player4 );

           PLAYER player5; player5.CharCD = 5;         player5.IsRedTeam = false;                      StagePlayers1.push_back( player5 );

           PLAYER player6; player6.CharCD = 6;         player6.IsRedTeam = false;                      StagePlayers1.push_back( player6 );

           PLAYER player7; player7.CharCD = 7;         player7.IsRedTeam = false;                      StagePlayers1.push_back( player7 );

 

           bool IsPartitioned = is_partitioned( StagePlayers1.begin(), StagePlayers1.end(),

                                                                                     []( PLAYER player ) -> bool { return player.IsRedTeam; } );

           if( IsPartitioned ) {

                     cout << "레드 팀과 블루 팀으로 구분 되어 나누어져 있습니다." << endl;

           } else {

                     cout << "레드 팀과 블루 팀으로 구분 되어 있지 않습니다." << endl;

           }

 

           vector< PLAYER >::iterator IterFirstBlueTeamPlayer = partition_point( StagePlayers1.begin(),StagePlayers1.end(),

                                                     []( PLAYER player ) -> bool { return player.IsRedTeam; } );

           if( IterFirstBlueTeamPlayer != StagePlayers1.end() ) {

                     cout << "첫 번째 블루 팀 플레이어. 캐릭터 코드 : " << (*IterFirstBlueTeamPlayer).CharCD << endl;

           }

 

                    

           vector< PLAYER > StagePlayers2;

           StagePlayers2.push_back( player7 );

           StagePlayers2.push_back( player6 );

           StagePlayers2.push_back( player1 );

           StagePlayers2.push_back( player5 );

           StagePlayers2.push_back( player4 );

           StagePlayers2.push_back( player3 );

           StagePlayers2.push_back( player2 );

          

           IsPartitioned = is_partitioned( StagePlayers2.begin(), StagePlayers2.end(),

                                                                                     []( PLAYER player ) -> bool { return player.IsRedTeam; } );

           if( IsPartitioned ) {

                     cout << "레드 팀과 블루 팀으로 구분 되어 나누어져 있습니다." << endl;

           } else {

                     cout << "레드 팀과 블루 팀으로 구분 되어 있지 않습니다." << endl;

           }

 

           getchar();

           return 0;

}

 

< 결과 >

 

예제 코드를 보니 쉽게 이해 되시죠? 그럼 저는 아는 걸로 생각하고 다음 포스팀에서는 다른 알고리즘을 설명하겠습니다^^

 

 

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!


  2. 마음을 휴식하고 재충전하는 휴식을 가져가라. 그것이 중단없이 십 년간 일했다면 당신은 메달을 얻을 수 없습니다. 일어나고은 혈관의 팽창가 발생하는 것입니다.

  3. 마케팅 조사의 목적은 고객이, 그들이 원하는 어디 그들이 구입하는 것을 선호하면 누군지 알아낼 것입니다. 마케팅 조사는 또한 고객의 요구 사항을 충족하기 위해 시장 확대로 해결 문제에 초점을 맞출 수 있습니다.

Posted by 흥배
제가 현재 VC++ 10에 추가된 C++0x의 새로운 알고리즘들을 소개하고 있습니다.
그런데 만약 STL에 대해서 모르시는 분들은 제가 올린 글들을 이해하기 힘드리라 생각합니다.

제가 예전에 한빛미디어사의 한빛네트워크 사이트에 STL과 관련된 글을 연재한 적이 있습니다.
여기의 글들을 보면 STL을 이해하는데 조금이나마 도움이 되지 않을까 생각합니다.


STL은 어려운 내용은 아니지만 어설프게 사용하면 형편 없는 결과를 얻기도 하니 기본적인 부분은
꼭 잘 배우기를 바랍니다( 최소한 STL의 각 컨테이너의 특징과 어떤 자료구조로 만들어져 있는지는
알고 있어야 합니다 ).
C++ 프로그래머로서 STL을 아는 것은 필수이니 아직 배우지 못한 분들은 꼭 공부하세요!! ^^


저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
TAG C++, STL, 흥배

댓글을 달아 주세요

Posted by 흥배

partition_copy 알고리즘은 하나의 집단에서 서로 다른 두 개의 집단으로 나눌 때 사용하는 것이라고 아주 간단하게 말할 수 있습니다.

 

partition_copy

template<class InputIterator, class OutputIterator1, class OutputIterator2, class Predicate>

    pair<OutputIterator1, OutputIterator2>

        partition_copy(

            InputIterator _First,

            InputIterator _Last,

            OutputIterator1 _Dest1,

            OutputIterator2 _Dest2,

            Predicate _Pred

        );

 데이터셋의 _First _Last 사이에 있는 각 요소 x를 조건자 _Pred에 인자를 넘겼을 때 true를 반환하면 x _Dest1, false를 반환하면 _Dest2에 복사하고 지정된 구간의 모든 요소를 다 처리하면 OutputIterator 값을 pair로 반환한다

 

그럼 좀 더 쉽게 이 알고리즘을 어떤 경우에 사용하는지 알 수 있도록 간단한 예제를 하나 보여드리겠습니다.

 ) 게임 아이템들을 팔 수 있는 것과 팔 수 없는 것으로 나누어라

#include <iostream>
#include <algorithm>
#include <vector>
#include <list>
using namespace std;

struct ITEM
{
    int nItemCode;
    bool bEnableSell;
};

int main()
{
    vector< ITEM > AllItems;
    ITEM item1; item1.nItemCode = 1;    item1.bEnableSell = false;        AllItems.push_back( item1 );
    ITEM item2; item2.nItemCode = 2;    item2.bEnableSell = true;        AllItems.push_back( item2 );
    ITEM item3; item3.nItemCode = 3;    item3.bEnableSell = true;        AllItems.push_back( item3 );
    ITEM item4; item4.nItemCode = 4;    item4.bEnableSell = false;        AllItems.push_back( item4 );
    ITEM item5; item5.nItemCode = 5;    item5.bEnableSell = true;        AllItems.push_back( item5 );
    ITEM item6; item6.nItemCode = 6;    item6.bEnableSell = false;        AllItems.push_back( item6 );
    ITEM item7; item7.nItemCode = 7;    item7.bEnableSell = true;        AllItems.push_back( item7 );

    ITEM UnItem; UnItem.nItemCode = 0;
    list< ITEM > SellItems( 7, UnItem );            
    list< ITEM > UnSellItems( 7, UnItem );
    
    pair<list< ITEM >::iterator, list< ITEM >::iterator > SeperateItems;
    SeperateItems = partition_copy( AllItems.begin(), AllItems.end(),
                                                 SellItems.begin(),
                                                 UnSellItems.begin(),
                                                   []( ITEM& item ) { return item.bEnableSell; } );

    cout << "팔 수 있는 아이템" << endl;
    for each( ITEM item in SellItems )
    {
        if( item.nItemCode <= 0 ) {
            continue;
        }
        cout << "아이템 코드 : " << item.nItemCode << endl;
    }

    cout << endl << endl;

    cout << "팔 수 없는 아이템" << endl;
    for( auto Iter = UnSellItems.begin(); Iter != UnSellItems.end(); ++Iter )
    {
        if( Iter->nItemCode <= 0 ) {
            continue;
        }
        cout << "아이템 코드 : " << Iter->nItemCode << endl;
    }
    
    getchar();
    return 0;
}

< 결과 >


partition_copy를 사용할 때 한 가지 주의할 점은 결과를 다른 컨테이너에 복사를 하므로 해당 컨테이너에 공간이

확보되어 있어 있어야 합니다. 그래서 위의 예제에도

ITEM UnItem; UnItem.nItemCode = 0;
list< ITEM > SellItems( 7, UnItem );            
list< ITEM > UnSellItems( 7, UnItem );

로 더미 값을 넣어서 복사할 공간을 확보하고 있습니다.

 

참조 : http://msdn.microsoft.com/ko-kr/library/ee384416.aspx

 

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 오~~~ 위의 코드는 온라인 게임을 해본적이 있는 개발자라면 이해가 절로 되는 예제일 것 같습니다.^^

    • 네이티브쪽은 모두 게임 개발자들이라서 예제가 게임 개발과 관련된 걸 생각하게 되네요^^

Posted by 흥배

MSDN을 보다 보니 C++/CLI의 델리게이트에 네이티브용 함수를 할당할 수 있는 방법이 있어서 소개합니다. 아래의 코드는 MSDN에 있는 것입니다.

 

#pragma unmanaged

extern "C" void printf(const char*, ...);

class A {

public:

   static void func(char* s) {

      printf(s);

   }

};

 

#pragma managed

public delegate void func(char*);

 

ref class B {

   A* ap;

 

public:

   B(A* ap):ap(ap) {}

   void func(char* s) {

      ap->func(s);

   }

};

 

int main() {

   A* a = new A;

   B^ b = gcnew B(a);

   func^ f = gcnew func(b, &B::func);

   f("hello");

   delete a;

}

< http://msdn.microsoft.com/ja-jp/library/9cy3ccxx%28v=VS.80%29.aspx >

 

위 코드 중 #pragma unmanaged 지시어 이하는 컴파일러에서 비관리코드로 취급합니다. 그리고 #pragma managed 이하는 관리코드로 취급합니다. 내용이 간단하고 어려운 부분이 없기 때문에 따로 자세한 설명은 생략하겠습니다.

 


C++/CLI는 단순하게 닷넷 플랫폼에서 사용할 수 있는 C++ 언어라기 보다는 C++ 언어의 부족한 부분을 진화 시킨 언어라고도 생각할 수 있는 부분이 꽤 있습니다. 그러나 C++/CLI는 C++과 C#의 중간의 애매한 위치에 있어서 양쪽 프로그래머 모두에게 별로 호응을 받지 못하는 것 같습니다. 그래서 C++/CLI 관련 글을 제가 처음에 생각했던 것보다는 조금 일찍 끝낼려고 합니다.

C++/CLI를 사용하는 대부분의 프로그래머들은 아마 기존의 비관리 코드를 관리코드에서 사용하고 싶을 때라고 생각합니다. C++/CLI의 기능 소개는 이번으로 일단 끝내고 앞으로는 비관리코드와의 연계에 대해서 실제 사례 보여주면서 설명하려고 합니다.


사례는 오픈 소스 네트워크 라이브러리인 HalfNetworkC++/CLI를 사용하여 관리코드에서 사용할 수 있도록 wrapping한 후 이것을 관리코드에서 사용할 예정입니다.

HalfNetwork는 온라인 게임 서버 프로그래머인 임영기님이 만든 것으로 ACE 라는 오픈 소스 네트워크 라이브러리를 사용하기 편하게 만든 라이브러리입니다.

 

소스 위치 http://code.google.com/p/halfnetwork/

문서 http://code.google.com/p/halfnetwork/w/list http://jacking.tistory.com/category/HalfNetwork

임영기님 블로그 http://javawork.egloos.com/

 

요즘 공부할 것은 너무 많은데 따라갈 시간은 부족해서 다음 글은 언제쯤 올리지 정확하게 알 수 없지만 최대한 빨리 다음 글들을 올려서 C++/CLI을 2010년 안에는 끝내고 내년에는 새로운 주제로 시작하겠습니다^^

 

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 많은 도움이 되었구요.
    글이 생각보다 짧아 진다니 좀 아쉽네요.
    기사 기대하고 있습니다.

    • 요즘 제가 바빠서 다음 글을 올리지 못하고 있습니다. 그래도 집에서 작업은 하고 있으니 곧 정리해서 올리겠습니다.^^