본문으로 바로가기

1주차 강의 내용 정리

category C++/여담 2019. 3. 9. 02:30

std::uniform_int_distribution<> 


시작범위와 끝 범위가 포함되는 범위 내에서 균등한 정규 분포를 생성합니다. ( default 는 해당 타입의 numeric_limits<result_type>::max 값 )


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
template<class IntType = int>
   class uniform_int_distribution {
public:
   // types
   typedef IntType result_type;
   struct param_type;
 
   // constructors and reset functions
   explicit uniform_int_distribution(
      result_type a = 0, result_type b = numeric_limits<result_type>::max());
   explicit uniform_int_distribution(const param_type& parm);
   void reset();
 
   // generating functions
   template <class URNG>
      result_type operator()(URNG& gen);
   template <class URNG>
      result_type operator()(URNG& gen, const param_type& parm);
 
   // property functions
   result_type a() const;
   result_type b() const;
   param_type param() const;
   void param(const param_type& parm);
   result_type min() const;
   result_type max() const;
};
cs


기본 인자타입은 정수(int) 타입입니다.

속성멤버 a() 는 현재 분포의 저장된 최하값을 반환하고 b() 는 현재 분포의 저장된 최상값을 반환합니다.

이 클래스의 a() 와 b() 는 공통 속성함수 min() 과 max() 가 반환한 값과 동일합니다.

param() 은 param_type 으로 저장된 분포 패키지를 설정하거나 반환합니다.

reset() 은 캐시된 모든 값을 버립니다. 따라서 operator()의 값은 호출전 엔진에서 얻은 값의 영향을 받지 않습니다.

operator() 함수는 현재 매개 변수 패키지 또는 지정된 변수 패키지에서 URNG 엔진을 기반으로 하여 생성된 값을 반환합니다.


1
2
3
explicit uniform_int_distribution(
   result_type a = 0, result_type b = std::numeric_limits<result_type>::max());
explicit uniform_int_distribution(const param_type& parm);
cs

생성자 uniform_int_distribution
result_type a : 난수 값의 하한으로, 하한 값도 포함합니다.
result_type b : 난수 값의 상한으로, 상한 값도 포함합니다. 기본으로 numeric_limits<result_type>::max() 을 받습니다. 
param_type parm : 분포를 생성하는데 사용되는 param_type 구조체 입니다.

1
2
3
4
5
6
    int a[10000];
    std::uniform_int_distribution<>  uid(01000);
    std::default_random_engine dre;
    
    for (int& i : a)
        a[i] = uid(dre);
cs


부동 소수점은 std::uniform_real_distribution<> 을 사용합니다.

1
2
3
4
5
6
7
8
9
10
 int main ( ) 
    std :: random_device rd ;   // 난수 엔진의 시드를 얻는 데 사용됩니다. 
    std :: mt19937 gen ( rd ( ) ) ;  
    std :: uniform_real_distribution <> dis ( 1.0 , 2.0 ) ; 
    for  ( int n =  0 ; n <  10 ;  ++ n )  {
        std::cout << dis(gen) << ' ';    // dis(gen) 을 호출할 때 마다 새로운 임의의 double std::cout << dis (gen) 가 생성됩니다.
    } 
    std :: cout  <<  ' \ n ' ; 
}
cs

std::default_random_engine


typedef 된 메르센 트위스터 엔진 입니다. ( mt19937 )


1
2
3
4
5
template <class UIntType,
    size_t W, size_t N, size_t M, size_t R,
    UIntType A, size_t U, UIntType D, size_t S,
    UIntType B, size_t T, UIntType C, size_t L, UIntType F>
class mersenne_twister_engine;
cs


자세한 생성자 내용 : https://docs.microsoft.com/ko-kr/cpp/standard-library/mersenne-twister-engine-class?view=vs-2017


MT19937 은 2^19937-1 의 주기를 가지며 623차원까지 동일 분포되어 있습니다. ( 0, 2w -1 )

비트 연산만으로 알고리즘을 구현하기 때문에 속도도 매우 빠릅니다.


1
    std::mt19937 mtrand(std::chrono::high_resolution_clock::now().time_since_epoch().count());
cs



std::sort


sort 에 대한 게시글 작성을 한 적이 있음 : https://openmynotepad.tistory.com/36?category=854742


1
2
3
4
5
6
7
8
9
10
template<class RandomAccessIterator>
   void sort(
      RandomAccessIterator first,
      RandomAccessIterator last);
 
template<class RandomAccessIterator, class Predicate>
   void sort(
      RandomAccessIterator first,
      RandomAccessIterator last,
      Predicate comp);
cs

sort는 기본적으로 임의 접근 반복자를 입력해야 합니다.

first : 임의 접근 반복자의 첫번째 구간입니다 

last : 임의 접근 반복자의 마지막 전 구간입니다. [ first, last ) 

comp : 이항 술어 입니다. 제공하지 않을시 기본적으로 오름차순입니다.

std::copy


소스 범위의 요소를 대상 범위의 요소에 할당하여 정방향으로 복사합니다.


1
2
3
4
5
template<class InputIterator, class OutputIterator>
OutputIterator copy(
    InputIterator first,
    InputIterator last,
    OutputIterator destBeg);
cs

first : 원본 범위에서 입력 반복자의 첫번째 구간입니다.

last : 원본 범위에서 입력 반복자의 마지막 전 구간입니다. [ first, last )

destBeg : 대상 범위에서 출력 반복자의 첫번째 구간입니다.

반환 값 : 대상 범위에서 마지막으로 입력된 값의 다음 주소의 반복자 입니다.

template<class InputIt, class OutputIt>
OutputIt copy(InputIt first, InputIt last, 
              OutputIt d_first)
{
    while (first != last) {
        *d_first++ = *first++;
    }

return d_first; }


이 알고리즘은 보시다 싶이, 반복기가 가리키는 값만 수정하며 원래의 값을 새로운 값으로 변경시킵니다.

새 요소를 만드는데 사용할 수 없고, 컨테이너에 새로운 값을 집어넣는데 사용할 수 없습니다. ( 사용하려면 inserter 같은 iteartor을 같이 사용하셔야 합니다. )



std::chrono


chrono 는 헤더의 이름이지만 사실은 namespace 이름입니다. 

이 헤더의 요소는 시간을 처리합니다. 이것은 주로 세가지 개념을 통해 처리됩니다.


기간
그들은 1 분, 2 시간 또는 10 밀리 초와 같은 시간 범위를 측정합니다. 
이 라이브러리에서는 개수 표현 과 기간 정밀도 를 결합하는 기간 클래스 템플릿의 객체로 표현됩니다 (예 : 10 밀리 초는 10을 카운트 표현으로 , 밀리 초를 기간 정밀도로 나타냄).
시점
생일, 오늘의 새벽 또는 다음 기차가 지나갈 때와 같은 특정 시점에 대한 참조. 
이 라이브러리에서 time_point 클래스 템플리트의 오브젝트 는 신기원을 기준으로 한 지속 시간 ( 동일한 클록을 사용하는 모든 time_point 오브젝트에 공통된 고정 된 시간 지점)을 사용하여이를 표현합니다.
시계
시간 지점 을 실제 실제 시간 과 관련시키는 프레임 워크 
라이브러리는 현재 시간을 time_point : system_clock , steady_clock 및 high_resolution_clock 으로 표현하는 수단을 제공하는 적어도 세 개의 클럭을 제공합니다 .


class


duration : 시간 간격을 포함하는 유형을 설명합니다.


time_point : 시점을 나타내는 형식을 설명합니다.


structs


common_type : duration 및 time_point 의 인스턴스화에 대한 템플릿 클래스 common_type 의 특수화에 대해 설명합니다.


dudration_values : duration 템플릿 매개 변수 Rep 에 특정한 값을 제공합니다.


steady_clock : steady 클록을 나타냅니다.


system_clock : 실시간 시계를 기반으로 하는 시계 형식을 나타냅니다.


treat_as_floating_point : 형식이 부동 소수점 형식으로 처리될 수 있는지 여부를 지정합니다.



미리 정의된 형식

Typedef설명
typedef duration<long long, nano> nanoseconds;틱 기간이 1나노초인 duration 형식의 동의어입니다.
typedef duration<long long, micro> microseconds;틱 기간이 1마이크로초인 duration 형식의 동의어입니다.
typedef duration<long long, milli> milliseconds;틱 기간이 1밀리초인 duration 형식의 동의어입니다.
typedef duration<long long> seconds;틱 기간이 1초인 duration 형식의 동의어입니다.
typedef duration<int, ratio<60> > minutes;틱 기간이 1분인 duration 형식의 동의어입니다.
typedef duration<int, ratio<3600> > hours;틱 기간이 1시간인 duration 형식의 동의어입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef ratio<11000000000000000000> atto;
typedef ratio<11000000000000000> femto;
typedef ratio<11000000000000> pico;
typedef ratio<11000000000> nano;
typedef ratio<11000000> micro;
typedef ratio<11000> milli;
typedef ratio<1100> centi;
typedef ratio<110> deci;
typedef ratio<101> deca;
typedef ratio<1001> hecto;
typedef ratio<10001> kilo;
typedef ratio<10000001> mega;
typedef ratio<10000000001> giga;
typedef ratio<10000000000001> tera;
typedef ratio<10000000000000001> peta;
typedef ratio<10000000000000000001> exa;
cs


리터럴


C++11 이후부터 큰 형식 안정성 및 편의를 위해 리터럴이 추가되었습니다.

기본적으로 literals::chrono_literals 이름 공간 안에 위치하며, chrono 헤더를 추가하면 자동으로 추가됩니다.

Literal설명
chrono::hours 연산자 "" h(부호 없는 long long Val)정수 계열 값으로 시간을 지정합니다.
chrono:: duration<이중선 비율<3600 >> 연산자 "" h (long double Val)부동 소수점 값으로 시간을 지정합니다.
chrono::minutes (연산자 "" min)(부호 없는 long long Val)정수 계열 값으로 분을 지정합니다.
chrono:: duration<이중선 비율<60 >> (연산자 "" min) (long double Val)부동 소수점 값으로 분을 지정합니다.
chrono::seconds 연산자 "" s(부호 없는 long long Val)정수 계열 값으로 분을 지정합니다.
chrono::duration<double> 연산자 "" s(long double Val)부동 소수점 값으로 초를 지정합니다.
chrono::milliseconds 연산자 "" ms(부호 없는 long long Val)정수 계열 값으로 밀리초를 지정합니다.
chrono::duration<double, milli> 연산자 "" ms(long double Val)부동 소수점 값으로 밀리초를 지정합니다.
chrono::microseconds 연산자 "" us(부호 없는 long long Val)정수 계열 값으로 마이크로초를 지정합니다.
chrono::duration<double, micro> 연산자 "" us(long double Val)부동 소수점 값으로 마이크로초를 지정합니다.
chrono::nanoseconds 연산자 "" ns(부호 없는 long long Val)정수 계열 값으로 나노초를 지정합니다.
chrono::duration<double, nano> 연산자 "" ns(long double Val)부동 소수점 값으로 나노초를 지정합니다.
1
2
3
constexpr auto day = 24h;
constexpr auto week = 24h* 7;
constexpr auto my_duration_unit = 108ms;
cs

1
2
3
    auto now = std::chrono::system_clock().now();
    auto date = std::chrono::system_clock().to_time_t(now);
    std::cout << ctime(&date) << std::endl;
cs