pair 란?

한번에 두개의 자료형을 갖는 클래스.

사용자가 직접 지정.

그냥 클래스를 만들때 사용하기도 하지만 스택, 큐 등에 유용하게 사용

pair사용법

1.헤더파일 #include <uitiliy>

2.생성하기위해 pair<자료형1,자료형2> 클래스명(자료형1변수,자료형2변수)

3.첫번째 자료형을 보기 위해서는 클래스명.first, 두번째 자료형을 보기 위해서는 클래스명.second이다.

4.변수를 보기 위해서는 두가지 방법이 있다.

첫번째는 클래스명.first=새로운 변수, 클래스명.second=새로운 변수

두번째는 클래스명 = make_pair(첫번째 변수, 두번째 변수)이다.

#include <iostream>
//pair를 사용하기 위해서는 <utility>헤더파일 필요
#include <utility>
using namespace std;

int main()
{
    //1.생성과 동시에 초기화
    pair<int, char> x(15, 'a');
    cout << x.first<<endl;
    cout << x.second<<endl;
    //2\. x.first, x.second에 직접 담아주기
    x.first = 16;
    x.second = 'b';
    cout << x.first << endl;
    cout << x.second << endl;
    //3.make_pair(int,char)로 초기화
    x = make_pair(17, 'c');
    cout << x.first << endl;
    cout << x.second << endl;
    return 0;
}

pair로 세개짜리 변수를 갖는 클래스 만들기

다음과 같이 하면 된다.

 pair<pair<int, int>, int> ppp;
    ppp.first.first = 1;
    ppp.first.second = 2;
    ppp.second = 3;
    cout << ppp.first.first << endl << ppp.first.second <<endl<< ppp.second;

pair를 stack 과 queue에 응용

    queue<pair<int, int>> q;
    q.push(make_pair(33, 32));
    cout << q.front().first << endl << q.front().second<<endl;


    stack<pair<int, char>> s;
    s.push(make_pair(31, 'a'));
    cout << s.top().first << endl << s.top().second;

'언어 > CPP(cpp)' 카테고리의 다른 글

c++ 벡터,큐,스택 정리 (비교)  (0) 2019.02.09
c++무한대표현하기.무한값 표현하기  (0) 2018.11.04
템플릿  (0) 2018.02.06
오버라이딩  (0) 2018.02.06
상속  (0) 2018.02.06

// ConsoleApplication1.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
//

#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <limits>
using namespace std;

int main()
{
    int val1;
    val1 = numeric_limits<int>::max();
    cout << val1;
}

위와같은 에러메세지가 출력되었다.

코드는 위와같다.

무엇이 문제일까??

Col의 #define의 Col과 함수의 Col이 겹치기 때문이다.!!!

위와같이 함수선언부의 변수를 비워주고!!

위와같이 함수부의 변수명을 바꾸어주니

잘된다! 와!

'언어 > c' 카테고리의 다른 글

printf로 ""(큰따옴표), ''(작은따옴표) 출력하기  (0) 2018.02.16
구조체  (0) 2018.02.08
기억클래스  (0) 2018.02.08
(c)트러블슈팅-Floating point exception (core dumped)  (0) 2018.02.07
동적 메모리 할당  (0) 2018.02.01

큰따옴표는 \", 작은따옴표는 \' -->이런식으로 역슬래쉬를 앞에 붙여주면 된다.

'언어 > c' 카테고리의 다른 글

error:expectec ';',','or ')'before numeric constant 오류  (0) 2018.02.19
구조체  (0) 2018.02.08
기억클래스  (0) 2018.02.08
(c)트러블슈팅-Floating point exception (core dumped)  (0) 2018.02.07
동적 메모리 할당  (0) 2018.02.01

외부정렬

하드디스크를 이용하여 자료를 정리한다.

속도는 느리지만

순차정렬

순차적으로 맨 앞에서부터 채워나간다.

작은숫자부터 앞에서 채워나가고 싶다고 한다면 (312 -> 123 순으로)

맨앞자리에 가장작은 숫자를 넣고 그다음 두번째 자리에 가장작은숫자를 넣고 그다음 세번째 자리에 가장작은 숫자를 넣는다.

이를 위한 알고리즘은 맨첫번째 자리와 두번째,세번째...가면서 자기보다 작은 숫자를 찾는다.

그리고 그수를 바꾼다.

바뀐수는 또다시 두번째, 세번째중 자기보다 작은수를 찾는다...

쭉하다 어떤 수 부터는 자기자신과 바뀌는 수가 없을것이다.

그러면 그때 끝이 난다.

이런식으로 두번째 세번째 쭈욱 해준다.

즉 i번째 숫자! 라는 key를 갖고 쭈우우욱 비교!

선택정렬

선택정렬은 해당자리에 가장 알맞은수를 찾아 넣는것이다.

즉 1,2,3,4,5 순으로 배치하고 싶다면 첫번째 자리에 가장 알맞은 자리 숫자 1을 찾는다.

3,4,1,5,2 --> 이런 순으로 있다면 int minimum을 선언하여 가장 작은 숫자 1을 찾아 minimum에 넣어주고 이를 첫번째 자리에 넣어준후 첫번째 자리 숫자를 기존 1이 있던 자리에 넣어준다.

즉 이는 5번만 수행하여 각자리에 알맞은 숫자를 넣어준다.

버블정렬

짝을지어 확인하는 방법이다. 예를 들어

32145 가 있으면 두개씩 짝짓는다고 할때 32가 일단 짝지어질 것이다.

그러면 2가더 작으니 32가 23이 된다. 이제 배열은 23145가 된다.

그다음 31을 짝짓는다. 그러면 1이 더 작으니 21345 가 된다.

그다음 34를 짝짓는다. 안바뀐다. 그다음 45를 짝짓는다. 안바뀐다.

즉 이런식으로 하면 맨뒤에 부터 내가 원하는 자릿수가 체워진다.

이번에는 짝짓는것을 21->12. 23. 34 -> 이렇게 네번만 짝지으면 된다.

이런식으로 짝짓기를 한턴 할때마다 맨뒤에 가장 큰수가 채워진다.

그리고 짝짓는 횟수는 한번씩 줄어들게 된다.

삽입정렬

비효율적이지만 대용량에 유리한 정렬이다.

설명 1.

3105에서 맨처음 <31>을 본다. 1은 이중에 자기의 자리인 첫번째 자리로 가고 3은 밀린다.

<13>이 된다. <130>을 본다. 0은 앞의 13 중 자기가 들어갈 자리를 본다. 첫번째 자리로 가고 13은 밀려서 013이 된다.

<0135>는 그대로 이다.

설명 2.

3105 에서 범위를 <31>로 하여 맨처음 31을 짝짓는다. 13이 된다.

그다음 범위를 <130>로하여 뒤에서부터 30을 비교. 0이 더작으니 앞으로 간다.

<103>에서 10을 비교. 0 이 더 작으니 앞으로 간다. <013>

그다음 범위를 <0135>로 한다. 그리고 35->13->01을 비교한다.

퀵정렬

퀵정렬은 재귀함수의 특성을 이용한다.

방법은 다음과같다.

31762 가 있다. 12367을 만들어 보자.

<3>1762 --> 이렇게 맨앞자리(굳이 맨앞이 아니여도됌) 를 기준으로 잡는다.

그리고 왼쪽부터 3보다 큰값이 있는지 확인한다. 그리고 오른쪽부터 3보다 작은값을 찾는다.

7을 찾고 2를 찾았다. 그럼 바꾸어준다.

<3>1267 이 된다.

그리고 왼쪽부터 3보다 작은값, 오른쪽부터 3보다 큰값을 찾는다. 이때 2까지는 3보다 작은값, 그리고 6까지는 3보다 큰값에 해당된다. 즉 내가 원하는 3보다 큰값, 우측부터 3보다 작은값을 못찾았다. 이런경우 교차한다 하며 이는 내림차순이므로 왼쪽값인 2를 기준으로 넣어준다.

<2>1367 이 된다.

이제 왼쪽부터 2보다 큰값, 우측부터 2보다 작은값을 찾아보자.

이번에도 동시에 만족하는것을 찾지못하고 1에서 교차가 일어난다.

그러면 기준은 1이되어 <1>2367이 된다.

더이상 교차는 없다. 그럼 끝이다.

이를 재귀함수로 부르는 것이 퀵정렬이다.

만족한다.

그러면 가운대에 2를 3대신 넣는다.

<2>1367 이 된다.

이제 왼쪽부터 2보다 큰값, 오른쪽부터 2보다 작은값을 찾는다.

`` 참고

https://www.youtube.com/watch?v=agfEj9_0k00

``

쉘정렬

0435792861 이런식으로 있다면 배열의길이인 10 /2 를 한다 . 5이다.

5를 간격으로 삽입정렬을 통해 배열을 나열한다.

그다음 5/2인 2를 통해 2를 간격으로 삽입정렬을 통해 배열을 나열한다.

2/1인 1을 간격으로 삽입정렬을 통해 배열을 나열한다.

구조체란?

서로 다른 데이터형을 집합시켜 단일변수로 처리하게 해주는 복합 데이터형이다. 우리가 흔히 아는 int,double,char형 등의 변수와 동일하게 0차원으로써 하나의 데이터 타입을 만족한다.

선언된 순서대로 메모리에 할당되며 이의 특성을 고려하여 파일 입추력시 유용하다.

사용방법은

struct 구조체명{

맴버1 선언
맴버2 선언
...
}<전역 구조체명>;

참고로 구조체는 파스칼 네이밍 방식을 사용한다.(appleFruitKiwi 대분자로 띄어쓰기 표시)

구조체와 메모리

구조체의 틀자체는 공간을 차지않는다.

일반 데이터타입과 마찬가지로 구조체로 변수를 찍어내면 그때 메모리가 할당되게 된다.

구조체가 받을 수 있는 맴버

int char double등 뿐 아니라 배열, 또 다른 구조체까지 구조체의 맴버로 사용 가능하다.

구조체 만들어보기

struct끼리른 대입연산이 가능하며 입력한 변수 순서 그대로 입력된다.

struct도 배열이 가능하므로 초기화시 {{},{},{}..} 로 해준다.

구조체 배열생성및 대입

이런식으로 할경우 형식이 다르다는 오류가 발생.

직접 고치려면 이렇게 일일 히 바꾸어 주어야한다.

구조체 포인터

해당 포인터의 맴버변수 접근시 * 가아닌 ->를 이용한다.

기억클래스

프로그램 내에서 유효범위, 생존기간, 메모리에서의 위치, 변수의 성격을 결정하는 프로그램 요소이다. 대표적으로 auto(로컬변수-생존기간은 해당 함수 끝날때까지. 메모리에서는 stack영역), extern(글로벌 변수-생존기간은 프로그램이 시작될때 생성되어 끝날때 사라짐. 메모리에서는 data영역)

즉 우리가 main내부나 함수 내부에서 변수를 생성시 auto 가 자동으로 붙는것이고 외부에서 전역으로 생성시 extern이라는 표기가 자동으로 넣어지는것이다.

예제를 보면 auto로 할시 그결과가 없는것과 동일함을 확인할 수 있다.

메모리 영역

text영역

실행코드string 영역. 컴파일될때 크기가 결정된다.

data영역

extern,static,초기화 된것

bss영역

extern,static 초기화 안된것

heap 영역

동적 할당. 밑에서부터 공간이 할당된다. 이역시 프로그램을 실행시켜야 공간을 알 수 있다.

stack 영역

변수 할당. 런타임시 크기가 할당됨. 위에서부타가 아닌 밑에서 부터 체워진다.

그 이유는 stack 영역은 얼머나 공간이 할당될지 모르기 때문이다.

즉 함수의 변수를 auto로 할시 블록 단위로 살기에 call시 생기고 call이 끝나면 죽는다.

컴파일과 런타임

컴파일은 소스코드를 연결하는 과정으로 컴파일 오류는 문법적 오류라 할 수 있다.

런타임 오류는 실행중 발생하는 오류로 프로그램을 수행할수 없을때 발생한다.

본인은 보통 0으로나누거나 , 없는 메모리에 접근할때 발생가하곤 한다.

전역변수와 지역변수

전역변수를 함수에서 사용하니 잘됨을 확인할 수 있었다. 예제를 보면 전역변수가 선언된후 동일 이름의 지역변수가 선언되니 전역변수가 아닌 지역변수가 사용됨을 알 수 있다.

'언어 > c' 카테고리의 다른 글

printf로 ""(큰따옴표), ''(작은따옴표) 출력하기  (0) 2018.02.16
구조체  (0) 2018.02.08
(c)트러블슈팅-Floating point exception (core dumped)  (0) 2018.02.07
동적 메모리 할당  (0) 2018.02.01
배열  (0) 2018.02.01

나누기 할시 변수/0꼴이 있으면 발생한다.

'언어 > c' 카테고리의 다른 글

구조체  (0) 2018.02.08
기억클래스  (0) 2018.02.08
동적 메모리 할당  (0) 2018.02.01
배열  (0) 2018.02.01
함수_return_parameter_static_swap  (0) 2018.02.01

템플릿

함수나 클래스에서 사용되는 변수가 다른함수나 클래스를 정의할때 변수의 type이 바뀌는 경우 template 클래스로 정의한다. 그리고 사용 되는 변수에 맞게 객체를 선언시 컴파일러가 알아서 해당하는 함수나 클래스를 생성하여준다.

템플릿 클레스

달라지는 부분은 총 네가지이다.

1.클래스 선언 앞부분.

2.함수 선언 앞부분.

3.함수 scope 부분.

4.변수 선언부

->모든 함수, 클래스 앞부분은 template<class T>를 써주자.

ex)

헤더파일 ```

#pragma once template 1.클래스 선언 앞부분에 템플레이트 정의삽입! class CPair { public: void Setm1(T ma);
T Getm1() const; CPair(T ma);

private: T m1; };

>cpp 파일

#include "stdafx.h"

#include "CPair.h" template ->2.함수선언 앞부분 정의 삽입! CPair::CPair(T ma) : m1(ma) ->3.함수 스코프 앞에 리턴타입t와 삽입! {

} template T CPair::Getm1() const { return m1; } template void CPair::Setm1(T ma) { m1 = ma; }

>main문

#include "stdafx.h"

#include "CPair.h";

#include "CPair.cpp"

#include

#include using namespace std;

int main() { CPair q1(10); ->변수선언을 벡터처럼 바꾸어줌!이것은 int형 q1! cout << q1.Getm1(); return 0; }

# 템플릿 함수

달라지는 부분은 총 세가지이다.

1.함수선언 앞부분

2.변수선언부

3.함수 정의 앞부분.

ex) template void swapValues(T& var1, T& var2);

int main() { //char a = 'a', b = 'b';

int a = 3, b = 4;
cout << "a=" << a << "b=" << b<<endl;
swapValues(a, b);
cout << "a=" << a << "b=" << b<<endl;

char c = 'c', d = 'd';
cout << "c=" << c << "d=" << d << endl;
swapValues(c, d);
cout << "c=" << c << "d=" << d<<endl<<endl;

return 0;

}

template void swapValues(T &r1, T &r2) { T temp; temp = r1; r1 = r2; r2 = temp; }

```

+ Recent posts