1. stringstream

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
28
29
30
/*
stringstream
 
#include <sstream>
 
문자열에 여러가지 자료형이 한번에 들어올때 파싱해서 자르기 위해 사용
예를들어 "날짜 일정" 이런식으로 들어오면
날짜는 int로 자르고, 일정은 string으로 자르고
 
stringstream은 공백과 '\n'을 제외하고 정보를 빼냄
stream.str(string s)는 현재 stream의 값을 문자열 str로 바꿈
 
stream >> 연산자로 한개씩 다음 값을 넣어줄 수 있음
*/
 
#include <iostream>
#include <sstream>
 
using namespace std;
 
void main()
{
    string info = "뱃살 생일 1105";
    stringstream stream;
    stream.str(info);
    
    string part;
    while(stream >> part)
        cout << part << endl;
}
 
 

 

2. 이진수와 십진수

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
#include <bitset>
 
using namespace std;
 
void main()
{
    /*
    # 이진수와 친해져보기
 
    정수의 경우 bitset을 쓰면 쉽다.
    단 bitset은 소수점 아래에 숫자가 있는 실수를 쓰려면 복잡해 지는 듯 하다
    그러니 직접 하는 법도 알아보자
 
    십진수가 소수점 위면 2로 나눠서 계산
    십진수가 소수점 아래면 2를 곱해서 계산
 
    소수점 이상은 떼어내서 bitset 쓰고 소수점 아래는 직접 해도 될듯
 
    # 소수점 위는 아래의 방식으로 해결
    2로 나눈 나머지를 구하고, 2로 나누기를 반복
    나온 결과를 아래에서 위로 읽으면 된다.
    예를들어 10진수 4를 2진수로 변환하려면
    4%2는 0, 4를 2로 나눠주고 => 0
    2%2는 0, 2를 2로 나눠주고 => 0
    1%2는 1, 1을 2로 나눠주고 => 1
    끝났으니 역순으로 읽으면 100이 된다.
 
    # 소수점 아래는 아래의 방식으로 해결
    2를 곱한 후 소수점 위 값을 구하고, 그 값을 빼주기를 반복
    나온 결과를 위에서 아래로 읽으면 된다.
    예를 들어 0.625를 2진수로 변환하려면
    0.625에 2를 곱해서 1.25, 여기서 소수점 위의 수 1을 빼줌 => 1
    다시 0.25에 2를 곱해서 0.5, 소수점 위의 0을 빼줌 => 0
    다시 0.5에 2를 곱해서 1.0, 소수점 위의 1을 빼줌 => 1
    숫자가 0이 되었으니 끝
    결과는 오른쪽에 나온 숫자들을 위에서 아래로 읽으면 됨
    이진수 0.101이 십진수 0.625인 셈
 
    case 1 = 10진수 정수를 2진수로 변환하기
    case 2 = 10진수 실수를 2진수로 변환하기
    case 3 = 2진수를 10진수로 변환하기
    */
 
    /*
    case 1 = 10진수 정수를 2진수로 변환하기
    */
 
    // bitset 사용방식
    int n2bit = 5;
    cout << "5는 2진수로 : " << bitset<8 * sizeof(n2bit)>(n2bit) << endl;
 
    // 직접 구현 방식
    int result = 0;    
    for(int i=1; n2bit >= 1; i *= 10) {
        result = (n2bit % 2* i + result;
        n2bit /= 2;
    }
    cout << "5는 2진수로 : " << result << endl;
 
    /*
    case 2 = 10진수 실수를 2진수로 변환하기
    소수점 윗부분은 떼어내서 bitset을 써도 되고, 직접 해도 된다.
    여기선 소수점 아래 부분만
    */
    double d2bit = 0.625;
    cout << "0.625는 2진수로 0.";
    while (d2bit != 0)
    {
        d2bit *= 2;
        cout << (int)d2bit;
 
        if (d2bit >= 1) d2bit -= 1;
    }
    cout << endl;
 
    /*
    case 3 = 2진수를 10진수로 변환하기
    */
 
    // bitset 사용방식
    // bitset 객체에 넣고 to_ulong() 하면 끝
    int num1 = 10;
    int num2 = 15;
 
    bitset<32> b1(num1);  // b1 = 1010
    bitset<32> b2(num2);  // b2 = 1111
 
    cout << b1 << endl// 출력시 000000.....1010
    cout << b1.to_ulong() << endl// 출력시 10진수 10
    
    // 직접 구현 방식
    result = 0;
    int bit = 100// 2진수 100이니 10진수로 4
    for (int j = 0; bit >= 1; j++) {
        result += (bit % 10* pow(2, j);
        bit /= 10;
    }
    cout << "이진수 100은 10진수로 " << result << endl;
}
 
 

 

3. pair template Class

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
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
 
using namespace std;
 
void main()
{
    /*
    pair template Class
    두개의 연관된 데이터를 다룰때 편리하게 사용 가능
 
    #include <utility>가 필요하지만
    #include <algorithm>이나
    #include <vector>에 이미 utility 헤더가 포함되어있음
   그러니 algorithm이나 vector를 포함한다면 utility는 안해도 된다
 
    template <class T1, class T2> struct pair;
    T1은 first로 접근, T2는 second로 접근
 
    사용법
    pair<type1, type2> p로 pair클래스의 p 객체를 생성
    p.first는 p의 첫번째 인자
    p.second는 p의 두번째 인자
    make_pair(값1, 값2)는 값1, 값2를 한 쌍으로 하는 pair를 리턴해줌
 
    pair객체간의 비교시 first로 먼저 비교하고 같으면 second로 비교한다
    */
 
    pair<intint> ip;
    ip.first = 1;
    ip.first = 2// 이런식으로 대입도 가능
    
    cout << "ip.first : " << ip.first << ", ip.second : " << ip.second << endl;
 
    pair<intdouble> idp(12.5); // 이런식으로초기화도 가능
    cout << "idp.first : " << idp.first << ", idp.second : " << idp.second << endl;
 
    pair<stringint> sip;
    sip = make_pair("스트링"10); // make_pair를 사용해 대입도 가능
    cout << "sip.first : " << sip.first << ", sip.second : " << sip.second << endl;
}