'2018-02/c++'에 해당되는 글 24건

 [ 1 ]  [ 2 ]  [ 3 ] 
2018-02/c++

Visual Studio 에서 scanf, printf 사용하기

증상 : visual studio에서 compile 할때 scanf, printf는 deprecated 에러가 뜨는 현상


조치 : stdafx.h에 


#define _CRT_SECURE_NO_WARNINGS


플래그 추가


결과 : 컴파일이 정상적으로 이루어진다.

'2018-02 > c++' 카테고리의 다른 글

Visual Studio 에서 scanf, printf 사용하기  (0) 2018.06.03
make, premake4 실험실  (0) 2018.05.04
c++ 실험실  (0) 2018.05.04
g++ 컴파일러 실험실  (0) 2018.05.04
c++ 라이브러리와 함수 요약  (0) 2018.04.18
연산자와 비트 연산  (0) 2018.04.13
2018-02/c++

make, premake4 실험실

make는 컴파일 스크립트 파일이다. 서로의 의존성을 관리하면서 순차적으로 실행 파일들을 만들어낼 수 있다.


예시)


Makefile


diary_exe : test1.o test2.o main.o

g++ -o diary_exe test1.o test2.o main.o

test1.o : 

g++ -c test1.cpp

test2.o :

g++ -c test2.cpp

main.o :

g++ -c main.cpp

clean :

rm *.o diary_exe


** 실행명은 그냥 명일뿐 저걸 파일이름 test1.o 이 아니라 jinhyuk으로 바꿔서 dependency 해도 같다. jinhyuk만 하고 dependency는 파일명으로 해도 된다. dependency는 그 프로세스 또는 그 파일을 얘기할 수 있는 것 같다.

** 이미 파일이 있으면 make가 진행되지 않으므로 clean을 하나 만들어둔다. 실행은 make clean으로 한다.


<Makefile 매크로 사용법>


CC = g++

로 하거나

CINCLUDE = -I ~/test

이런식으로 해둔 다음에


실행문 아님 아무튼 아무거나에다가 $(CINCLUDE) 로 쓰면 정확히 그 부분을 그 값으로 치환해 준다.


참고로 dependeny에서 파일명이나 프로세스 암거나 써도 된댔는데, 파일명으로 하면 그 오브젝트 파일이 없는 경우에 그것과 이름이 같은 cpp 파일을 자동으로 오브젝트 파일로 컴파일해서 써준다. 그러므로 이렇게 단순화될 수 있다.


book_exe : main.o test1.o test2.o

g++ -o book_exe main.o test1.o test2.o


>> 자동으로 오브젝트는 만들어 준다.


<기타 매크로>

$@ : 현재 타깃 이름

$^ : 현재 종속 항목 리스트



'2018-02 > c++' 카테고리의 다른 글

Visual Studio 에서 scanf, printf 사용하기  (0) 2018.06.03
make, premake4 실험실  (0) 2018.05.04
c++ 실험실  (0) 2018.05.04
g++ 컴파일러 실험실  (0) 2018.05.04
c++ 라이브러리와 함수 요약  (0) 2018.04.18
연산자와 비트 연산  (0) 2018.04.13
2018-02/c++

c++ 실험실


'2018-02 > c++' 카테고리의 다른 글

Visual Studio 에서 scanf, printf 사용하기  (0) 2018.06.03
make, premake4 실험실  (0) 2018.05.04
c++ 실험실  (0) 2018.05.04
g++ 컴파일러 실험실  (0) 2018.05.04
c++ 라이브러리와 함수 요약  (0) 2018.04.18
연산자와 비트 연산  (0) 2018.04.13
2018-02/c++

g++ 컴파일러 실험실

기본 컴파일 ( 단일 파일 )

g++ -o (exe 파일명) myfile.cpp

>> 새로운 파일을 생성


링커 파일 생성(.o파일)

g++  -c myfile.cpp

>> 자동으로 myfile.o 파일 생성


여러 파일 컴파일

g++ -o (exe파일명) myfile.cpp main.cpp

>> 새로운 실행파일을 생성

* dependency 순서로 적어야 한다.

g++ main.cpp myfile.cpp는 main에서 myfile을 링크해야 해서 안된다.


링커 파일 잇기

g++ -c myfile.cpp

g++ -o (exe파일명) main.cpp myfile.o

* 이 경우에는 순서 상관없음


[실험실]

헤더 파일과 몸통 파일의 이름이 다르면?

>> 상관없다.

즉 myfirst.h의 내용을 mysecond.cpp에 담은 다음에

g++ -c mysecond.cpp로 해서 mysecond.o를 만들어서

g++ -o test3 main.cpp mysecond.o로 하면 mysecond.o의 내용으로 실행된다.

즉 어쨌든 컴파일은 헤더가 아닌 cpp 파일 몸통을 하는거니까, 특정 헤더의 내용은 그걸 불러오는 cpp 파일을 기준으로 링크되고 그걸 링크하는 main에서는 링크된 그 파일을 링크해다 쓰는 듯 하다.


그러면 두개의 cpp에서 헤더 함수를 동시에 구현하면?

g++ -o test4 mysecond.cpp myfirst.cpp main.cpp

를 하면 mysecond.cpp에서 func의 정의를 이미 했다!! 하면서 myfirst에서 컴파일 에러가 난다.


헤더 파일을 이중으로 부르면?

그니까 mysecond.cpp에서 myfirst.h를 부르고 main.cpp에서 mysecond.h와 myfirst.h를 부르면?

아직까지는 문제가 없었는데

#pragma once를 쓰는게 관례인것 같다.

* 요즘은 문제가 없게 설계된 듯? 문제시 자삭


헤더 파일 없이 cpp 파일만 합칠 수 있나?

>>  된다.

#include "robot2.cpp" 식으로 cpp 파일도 합칠 수 있다.

합치는 방식은 아예 인클루드 부분에 코드를 붙여버리는 방식이다.

robot2.cpp에서 적은 using namespace std와 iostream 모두 main2에서 사용가능하게 된다.

단, g++ robot2.cpp main2.cpp를 해버리면

robot2.cpp가 중복이라고 에러 뜬다.


파일 이름에 의미가 있나?

그냥 정리하기 좋을 뿐이다. robot.jinhyuk도 인클루드 된다. 근데 컴파일러는 파일 구분하니까 써줘야 한다.


using namespace std?

이거 헤더에서 쓰면 그 헤더를 인클루드 하는 모든 애들도 다 적용되 버린다.

근데 헤더 구현하는 cpp에서 쓰면 다른 cpp에는 전달이 안된다(확실).


인클루드?

다른 cpp에 있는 인클루드는 포함 안된다.

헤더의 인클루드는 인클루드 한 곳에서 모드 인클루드된다.


-I로 인클루드 주소를 추가해 주면 컴파일러가 거기도 베이스 인클루드 디렉토리로 확인해 준다.

g++ -I ~/test test.cpp main.cpp

>> OK

g++ test.cpp main.cpp

>> <test.h> 가 없어서 안됨!!

그니까 <> 를 쓸 수 있다는 차이가 있음


< 구조 이해 >

그니깐, 컴파일러는 주어지는 cpp파일을 통해 헤더를 채워서 o 파일을 만들고

이것들을 이어서 하나의 실행파일을 만든다.

아마도 내부구조는 이렇게 되지 않을까

(먼저 주어지는 cpp에서 헤더 소스를 그대로 복 붙)

그러면 그 cpp파일에서 함수 프로토 + 원형 정의된 cpp 파일이 됨.

그리고 다음 cpp 파일에서 그 헤더를 붙이면 <헤더 뿐만이 아니라 이렇게 링크된 오브젝트 파일> 이 붙게 된다.

왜 그러냐면 만약에 두개의 cpp파일로 헤더를 이중 정의하려고 하면 두번째 파일에서 <이미 붙은 오브젝트임> 으로 에러가 뜬다..!!

그러므로 헤더 >> cpp >> 링커 오브젝트 파일

오브젝트 파일을 임포트해서 함수 사용

의 과정으로 컴파일 되는 것으로 보인다.

오브젝트 파일로 만들어버리고 소스를 복붙하는게 아니다보니 두번 인클루드해도 문제가 없고 한쪽 cpp에서 사용한 인클루드와 네임스페이스가 다른쪽에 전달이 안된다.


** 좀더 특이한 사실

헤더 파일을 인클루드 안해도 링크 오브젝트 파일을 형성하는 과정에서 자동으로 다 모아서 함수 원형과 연결해주는 듯 하다.

cpp 파일이 이름이 달라도, 심지어 맞는 헤더 인클루드 안해도 그냥 함수가 붙어 버린다.

근데 헤더를 인클루드 하는 이유는 일단 헤더에 인클루드 한걸 전부 받을 수 있어 편하다.

하나의 헤더의 함수를 채우는 cpp가 여러개여도 붙는다.


근데 사용하는 메인에서는 test.h를 인클루드 해야된다.


cpp 파일 내부에서 헤더에 없는 함수를 정의하면 main에서 받아보지 못하는 로컬 함수가 되어버린다. 헤더가 매개체가 되는 것은 맞다.

---


요점 다시


cpp 파일들은 각각 함수와 클래스를 가지고 있다.

다른 cpp 파일의 함수를 사용하고 싶으면 헤더를 통해 서로 이어야 한다.

헤더를 인클루드 하면 그 헤더가 활성화되는데, 그 헤더에 맞는 cpp 내의 함수를 찾아서 붙인다.

그리고 그 오브젝트 파일을 만들어 뒀다가 다른 함수에서 헤더를 불러 함수를 쓸 수 있도록 한다.

그 헤더를 완전히 사용하려면 그 헤더의 함수들을 만드는 모든 오브젝트 파일들을 함께 컴파일 해 주어야 한다.

헤더는 그렇게 다른 cpp 파일들의 의존관계를 이어주는 역할이다.

헤더가 없으면 서로 다른 cpp 파일 내의 함수들은 서로 사용 불가능하다..!!!


헤더의 역할 : 서로 다른 cpp 파일들 사이의 다리 역할이다. 서로 다른 cpp 파일들의 함수와 변수, 클래스 등을 사용할 수 있도록 한다.


<실험>

헤더 파일에 구체적인 내용을 적는 경우에는 defined twice라고 에러 뜬다. ifndef나 pragma once 써도 그렇다. 결국 헤더 - cpp 구조로 만들어야 한다는 것.


* 최종적으로 오브젝트 파일들을 링크할 때, g++에서 main 함수를 찾아서 exe의 입구를 만들어 준다.


(추가)

-L은 라이브러리 주소를 찾아주고

-l을 붙여서 라이브러리 이름을 불러준다.

라이브러리는 .a 형태의 확장자로 보통 여러개의 오브젝트 파일을 지닌다.


-Wall  :  워닝을 보여준다.

-g : 디버거를 연결하는 기능.


'2018-02 > c++' 카테고리의 다른 글

make, premake4 실험실  (0) 2018.05.04
c++ 실험실  (0) 2018.05.04
g++ 컴파일러 실험실  (0) 2018.05.04
c++ 라이브러리와 함수 요약  (0) 2018.04.18
연산자와 비트 연산  (0) 2018.04.13
자료구조 요점정리  (0) 2018.04.02
2018-02/c++

c++ 라이브러리와 함수 요약

#include <vector>

#include <queue> : priority_queue 여기 있다.

#include <stack>

#include <set> : multiset 여기에 있다.

#include <map> : multimap 포함

#include <unordered_set> : unordered_multiset

#include <unordered_map> : unordered_multimap

#include <functional> : greater<int>

#include <cstdlib> : srand, rand

#include <ctime> : time(NULL)

#include <chrono> : high_resolution_clock

#include <iomanip> : atoi()

#include <algorithm> : sort, reverse

#include <list>

#include <iostream>

#include <string>


'2018-02 > c++' 카테고리의 다른 글

c++ 실험실  (0) 2018.05.04
g++ 컴파일러 실험실  (0) 2018.05.04
c++ 라이브러리와 함수 요약  (0) 2018.04.18
연산자와 비트 연산  (0) 2018.04.13
자료구조 요점정리  (0) 2018.04.02
STL Stack  (0) 2018.04.01
2018-02/c++

연산자와 비트 연산

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
string print(int n) {
    stack<int> reverse;
    string ret = "";
    while (n != 0) {
        reverse.push('0' + n % 2);
        n /= 2;
    }
    while (reverse.size() != 0) {
        ret.push_back(reverse.top());
        reverse.pop();
    }
    return ret;
}
 
int toint(string s) {
    int ret = 0;
    int it = 1;
    for (int i = s.size() - 1; i >= 0; i--) {
        ret += (s[i] - '0')*it;
        it *= 2;
    }
    return ret;
}
cs


1. 비트 연산자 정리


~ : 비트를 전부 뒤집는다.

& : 좌우 모든 자리의 비트를 각각 & 연산 한다

| : 좌우 모든 자리의 비트를 각각 | 연산 한다.

^ : 좌우 모든 자리의 비트를 각각 ^연산 한다.

>> : 비트를 1 우측 쉬프트한다

<< : 비트를 1 좌측 쉬프트한다


2. 기본 비트 연산


 - 0001000000 : 1 << i

** "1" 은 32비트 정수형이기 때문에 64비트가 필요하면 ll 아님 ull을 붙여야 한다.

- 1110111111 : ~(1<<i)

- 00001111111 : (1<<i)-1

- 11111000000 : ~((1<<i)-1)

- -x = ~x+1

** 더 쉽게 생각하는 법 : 비트를 뒤집으면(~x) 음수 - 1 이 된다!!

- x-1 오른쪽 첫 1을 0으로 바꾸고 그 아래 비트를 전부 1로 바꾼다.

  x+1 오른쪽 첫 0을 1로 바꾸고 그 아래 비트를 전부 0으로 바꾼다.


3. 응용 비트 연산


- 원소의 존재 여부

n&(1<<m)

- 비트의 추가, 제거, 토글

추가

n = n|(1<<m)

제거

n=n&(~(1<<m))

토글

n=n^(1<<m)

- 집합 연산

합집합

n = a|b

교집합

n = a&b

차집합

n = a&(~b)

- (1110011101000 >> 1000) 가장 오른쪽의 비트 구하기   

n = a&(-a)

- (1101101100 >> 1101101000) 최소 1 지우기

n = n&(n-1)

- (첫 1까지의 모든 0 1로 바꾸기

n = n|(n-1)

- 첫 0까지의 모든 1 0으로 바꾸기

n = n&(n+1)

- 최소 0 켜기

n = n|(n+1)


9996. bitset<size> 자료구조


bitset<32> tmp(ba); // int ba를 tmp라는 bitset으로 생성한다

size 만큼의 bit를 가진 변수를 만든다. 각 비트를 접근할 수 있다.

양수와 음수 보수표현이 가능하다.


- 접근

tmp[13] 형식, bool이나 int나 char이나 암껄로 접근하면 된다.


- 연산

bitset간 bit연산 가능하다. 사칙연산은 안됨.. 정수나 다른 자료형과도 안됨


- 참고

최종 출력용으로 적합한듯. 근데 float형은 int로 캐스팅 한 후에 bitset에 저장되서 실제 값이 아니다.


9997. 진법 변환


헥스로..

cout << hex << 13232;


float를 binary로


- 비트 연산자는 int나 char 등의 정수 자료형에 해당(음수도 가능). floating point 연산에는 안된다.

floating point의 bit manipulation을 해야 하면 

union tester {

double f;

long long i;

};

을 사용하자. 더블의 바이트 값을 롱롱으로 읽어준다. 이 롱롱을 비트로 출력하면 된다.


정수를 binary로


bitset을 이용하자.


9998. 음수의 표현과 플로팅 포인트 표현


음수는 2의 보수법으로 표현된다.

2의 보수법은 MSB를 마이너스 값으로 표현해서 다 더한 값이다.

사칙연산과 비교 연산이 가능하다. 방법이 조금 다르다.

뺄셈은 2의 보수 표현을 더하는 식으로 구현한다.


floating point 표현법(IEEE754)

float(32bit) >> 1 부호 8 지수 23 숫자

double(64bit) >> 1 부호 11 지수 52 숫자


normalized 의 경우 ( exponent 1 ~ 마지막-1)

숫자 부분의 경우 1.xxxxx 의 xxxxx를 그대로 가져다 붙인 거고(2진법 분수이다)

부호는 부호고

지수 부분은 음수 지수까지 표현하기 위해 값 - 127 or 1023 을 해준 걸 곱한다(물론 2의 제곱)

참고로 8비트 float 지수부분의 경우 01111111 이 0을 뜻한다.

11 비트 double 지수부분의 경우에는 01111111111 이 0이다.


* 무한대 또는 계산안됨 등의 특수한 값을 표현하기 위해 지수부분 11111111 을 아껴둔다.

* 진짜 0을 표현하기 위해서, 그리고 매우 작은 값을 표현하기 위해 지수가 00000000 인 경우에는 값을 조금 다르게 표현하는데

값 = 부호 * 2^-126 * 0.xxxxxx(분수부분) 이렇게 1이 아니라 분수부분에 0을 쓴다.

값으로는 연속적인게 normalized 로 생각하면 2^-127*1.xxxxx 여야 하는데 분수 부분 하나를 지수 부분으로 보냈다고 생각하면 된다.

이게 좋은게 뭐냐면 0 표현이 가능해진다 ^^ 어짜피 2^-127 값을 표현하려면 E=00000000 이 되어야 하므로 값이 겹치는 경우도 없다.


9999. 기타 잡다한 사실


- 비트 연산자의 순위는 매우 낮은 편이므로 무조건 ( ) 괄호를 해 주어야 한다!!

- ! : 0이 아닌 int, float는 전부 1로, 0이나 0.00 은 1로 바꾸는 연산자

- float는 % 연산자가 작동 안한다!!

- 비교 연산자 ==, != 등은 int 와 float를 잘 비교해 준다. 아마 int를 float로 캐스팅 하는 거 같다. 다른 사칙연산자들과 같이

- 일반 연산자들은 인트와 플롯이 들어가면 플롯으로 캐스팅된다!!

- 16진수 상수 표현 : 0xaaba

- 2진수 상수 표현 : 0b1010101


10000. 코드 자료실


- LSB, MSB 쪽 비트 지우기


1
2
3
4
5
6
7
8
9
10
11
12
// clear all bits from msb to i
int clearMSB(int n, int i) {
    int m = (1 << i)-1;
    return n&m;
}
 
// clear all bits from i to LSB
int clearLSB(int n, int i) {
    int m = (1 << (i+1)) - 1;
    m = ~m;
    return n&m;
}
cs


'2018-02 > c++' 카테고리의 다른 글

g++ 컴파일러 실험실  (0) 2018.05.04
c++ 라이브러리와 함수 요약  (0) 2018.04.18
연산자와 비트 연산  (0) 2018.04.13
자료구조 요점정리  (0) 2018.04.02
STL Stack  (0) 2018.04.01
IO  (0) 2018.03.30
2018-02/c++

자료구조 요점정리

주요 알고리즘

sort(arr, arr+5, greater<int>());

sort(v1.begin(),v1.end(),greater<int>());


---


1. 일반 배열


- 선언

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

- 인덱싱

arr[2];

- 2차원 선언

arr[2][3];


2. 동적 배열


- 선언

int * arr = new int[3];

2차원 배열 선언

int ** arr = new int * [10];

for(int i = 0 ; i < 10 ; i++){

arr[i] = new int[15];

}


3. 벡터


- 선언

vector<int> arr1;

같은 값으로 미리 채운다

vector<int> arr1(10 , 123); // 갯수, 숫자


- 인덱싱

arr1[2]

arr1.at(2);


- 삽입

arr1.push_back(12);

arr1.insert(arr1.begin()+i, 12); // i번째 인덱스 "앞에" 끼워넣어서 새로운 벡터의 i번째가 된다.

arr1.insert(arr1.end(),arr2.begin(),arr2.end()); // arr1 맨 뒤에 arr2 전체를 끼워 넣는다.


- 삭제

arr1.erase(arr1.begin()+1) // 1번째 인덱스를 삭제

arr1.erase(arr1.begin()+2, arr1.begin()+5); // 2 ~ 4번째 인덱스를 삭제(마지막꺼는 삭제 x)

arr1.clear() // 전체 삭제


- 공간 확보

arr1.reserve(100);


- 참고 사항

 * 벡터 대소비교 및 등호 사용 가능하다!! 앞에서부터 lexiographically 비교한다.


4. 스택


- 선언

stack<int> arr1;


- 인덱싱

arr1.top();


- 삽입

arr1.push(12);


- 삭제

arr1.pop(); // void return이므로 top으로 쓰고 팝 할것


5. 큐


- 선언

queue<int> arr1;


- 인덱싱

arr1.front();

arr1.back();


- 삽입

arr1.push(12)


-삭제

arr1.pop();


6. 우선순위 큐(힙)


- 선언

priority_queue<int> arr1; // max heap

priority_queue<int, vector<int>, greater<int>> arr1; // min heap


- 인덱싱

arr1.top()


- 삽입

arr1.push(12)


- 삭제

arr1.pop()


7. 스트링


- 선언

string s;


- 인덱싱

s.at(1);

s[1];


- 삽입

s.push_back(char)

s.append(string variable)

s.insert(s.begin()+2, 'b');


- 삭제

s.erase(5) // 5 부터 쭉 삭제

s.erase(s.begin()+5) // 5만 딱 삭제

s.erase(5,9) // 5부터 시작해서 딱 9개 삭제

s.erase(s.begin()+5,s.begin()+9) // 5부터 시작해서 8까지 삭제


- 부분스트링 찾기

s.find(t); >> 찾으면 해당 인덱스 반환 못 찾으면 -1 반환

O(N)


- 부분 들어내고 딴걸로 바꾸기

s.replace(9,5,t); >> 9 10 11 12 13 5개 들어내고 t로 채우기(더 길어도 됨)

O(N)


- 스트링을 정수형으로

int z = stoi("132323");


- 참고 사항

* 스트링은 별도 counting sort를 만들면 O(k)로 정렬 가능하다!!


8. 리스트


- 선언

list<int> arr;


- 삽입

s.insert(advance(s.begin(),3),3);


- 삭제

s.erase(it);


- 인덱싱

s.front()

*it


9. 맵

map

multimap

unordered_map

unordered_multimap


앞 두개는 BST, 뒤 두개는 Hash table


- 선언

map<int,int> arr

multimap<int,int> arr

unordered_map<int,int> arr

unordered_multimap<int,int> arr


- 삽입

arr.insert(key) // arr.insert(23)


- 인덱싱

arr.find(23) >> returns iterator

arr.equal_range(23) >> returns iterator start, end ( end iterator은 그 자신은 포함 안하고 하나 앞까지가 진짜다 )

발견 못하면 end(), end() 반환함


arr.lower_bound(2) >> 2를 포함해서 더 큰 첫 index 반환

arr.upper_bound(2) >> 2보다 더 큰 첫 index 반환(2를 포함 x)

-- 이것들은 set,map,multiset,multimap에만 있다. 대소비교가 가능해서. O(logN).


- 삭제

arr.erase(itlow,itup) // itlow ~ itup-1 까지 삭제

arr.erase(23) // 23 키를 가진 것 삭제 ( multi 에서는 그 키 전부 삭제 )


- 참고 사항

 * 만약 multiset 같은데서 각 키별로 뭘 할 일이 있으면 set을 하나 더 써서 같이 삽입하면 된다.

 * find는 multi에서는 첫 번째 입력했던 value를 반환한다. 하나만.

 * map에서 iterator은 pair이므로 it->first, it->second 사용

 * multimap, multiset 은 모두 key 만 정렬해주고 value는 정렬 안해준다!!!


10. 셋

set

multiset

unordered_multiset

unordered_set

사실상 맵과 같다.


11. 이터레이터


큐, 스택, priority_queue에는 없다. 아예 업음!!


vector<int>::iterator it = arr1.begin() // 이게 정식 변수명


advance(it, -3) // 앞으로 3개 전진한다.

begin(arr), end(arr) // 앞뒤 원소의 이터레이터를 내놓는다.


it = it + 3 // +- 연산자는 벡터, 스트링에 있는데 나머지에는 없다. ++, -- 만 존재.


front, back >> vector, list 에는 존재. queue, stack, map 류에는 안 존재.


- 참고 사항

 * 클래스 간 대소비교를 하는데, STL 클래스들은 이터레이터를 순회하면서 개별 대소비교를 하는 것 같다. 즉 operator > < == 사용 가능!


11. back, front


list, vector, queue에 존재

stack, priority_queue에는 아예 없음


** 참고 사항


- 벡터나 셋 등도 전부 클래스인데, 클래스를 인자로 넣으면 전부 call by value로 원본 값에 레퍼런스 하지 않는다. 원본 값을 변경하고 싶으면 * 나 &을 쓰자. 근데 &는 참조 변수로 그 변수 자체가 그 값을 가리키는 별명인데, 포인터 변수는 그야말로 주소값 변수이다.




** 기타 내용

- 함수 인자에 const를 붙이는 경우 밖에서 거기에 const 아닌걸 넣는건 괜찮은데, 함수 내에서 그 인자의 값을 바꿀 수 없다.



'2018-02 > c++' 카테고리의 다른 글

c++ 라이브러리와 함수 요약  (0) 2018.04.18
연산자와 비트 연산  (0) 2018.04.13
자료구조 요점정리  (0) 2018.04.02
STL Stack  (0) 2018.04.01
IO  (0) 2018.03.30
File I/O  (0) 2018.03.30
2018-02/c++

STL Stack

한가지 특이한 점은 top을 써야되고 pop은 void return이라는 점

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stack>
 
using namespace std;
 
int main() {
    stack<int> tmp;
    tmp.push(3);
    tmp.push(4);
    cout << tmp.size() << endl;
    int t = tmp.top();
    cout << t << endl;
    tmp.pop();
    while(1){}
    return 0;
}
cs


'2018-02 > c++' 카테고리의 다른 글

연산자와 비트 연산  (0) 2018.04.13
자료구조 요점정리  (0) 2018.04.02
STL Stack  (0) 2018.04.01
IO  (0) 2018.03.30
File I/O  (0) 2018.03.30
STL Queues  (0) 2018.03.28
2018-02/c++

IO

1
2
3
4
5
6
7
8
9
10
11
12
#include <iomanip>
 
using namespace std;
 
int main() {
    double s = 0.123456789;
    cout << s << endl;
    cout << fixed << setprecision(10);
    cout << s << endl;
    while(1){}
    return 0;
}
cs


setting precision, >> 그 자릿수까지 0을 프린트, 값이 짤리면 거기까지 반올림 한다.

'2018-02 > c++' 카테고리의 다른 글

자료구조 요점정리  (0) 2018.04.02
STL Stack  (0) 2018.04.01
IO  (0) 2018.03.30
File I/O  (0) 2018.03.30
STL Queues  (0) 2018.03.28
SORTING  (0) 2018.03.26
2018-02/c++

File I/O

#include <fstream>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main() {
    ofstream out("out.out");
    for (int i = 0; i < 10; i++) {
        out << i << " " << i * 2 << endl;
    }
    out.close();
    cout << "done1" << endl;
    ifstream openFile("out.out");
    int T;
    //openFile >> T;
    long long tmp,k;
    while (openFile && !openFile.eof()) {
        openFile >> tmp >> k;
        if (openFile.eof()) {
            break;
        }
        printf("%lld %lld\n", tmp,k);
    } ;
    openFile.close();
    cout << "done2" << endl;
    while(1){}
    return 0;
}
cs

C style

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
#include <stdio.h>
 
int main(){
 
        FILE *fp ;
 
        int index;
 
        int data;
 
 
 
        fp = fopen("test.txt""w");
 
        for(index = 0 ; index < 10 ; index++){
 
                fprintf(fp, "%d\n", index);
 
        }
 
 
 
        fclose(fp);
 
 
 
        fp = fopen("test.txt""r");
 
 
 
        while(fscanf(fp, "%d"&data) != EOF){
 
                printf("%d\n", data);
 
 
 
        }
 
 
 
        fclose(fp);
 
        return 0;
 
}
 
 
 
출처: http://ra2kstar.tistory.com/53 [초보개발자 이야기.]
cs


'2018-02 > c++' 카테고리의 다른 글

STL Stack  (0) 2018.04.01
IO  (0) 2018.03.30
File I/O  (0) 2018.03.30
STL Queues  (0) 2018.03.28
SORTING  (0) 2018.03.26
maps STL  (0) 2018.03.25