For each문  =  python에서의 반복문처럼 배열의 요소를 통해 반복하는 구문

 

위를 사용하기 위해서는 주어진 배열의 자료형을 알아둬야함 아래의 예시를 보면

for ( int num : arr ){
        .... 수행할 내용 ....
}

 

arr[10]은 각 배열의 요소가 int 자료형을 취하고 있어야하며 각 배열의 index순서대로 for문 안에서 num이라는 변수로 사용가능하다.

 

다시 말하자면

 

for ( int i=0; i<10; i++){
        ..... 수행할 내용.....

}

 

여기에서는 arr[i]를 통해 배열의 요소에 접근한다면 위의 for each문에서는 num이라는 변수를 통해 접근이 가능하다.

 

for each문을 사용하면 코드의 내용을 좀더 쉽게 확인 가능하다.

 

하지만 for each문에서 사용될 배열을 동적할당으로 선언했다면 사용이 불가능하다.

 

하지막 std안에 있는 vector을 통해 동적할당을 했다면 사용 가능하다.

 

만약 for each문에서 각 배열의 요소에 대해 값을 불러오기만 한다면 위의 예시처럼 사용하면 되지만 만약 배열요소의 값을 변경하고 싶다면 아래와 값지 &를 사용해야한다.

 

for ( int& num : arr){
    .... 수행할 내용.....
}

 

혼자 공부한거라 틀린 내용일수도 있습니다.

 

입출력 스트림중 입력 스트림은 eof ( end of file ) 을 만나게 되면 동작을 끝내게 된다.

 

cin의 버퍼는 eof만난 순간 버퍼를 fail로 두고 X에 변수를 저장하지 않으므로 X의 값은 변하지 않게된다.

 

예를 들어 데이터를 받고 단순 데이터를 출력하는 과정을 생각해보면

입력 cin >> X cout << X Is endOfFile?
a a a F
b b b F
EOF EOF b T

 

 

cin에서 받은 데이터가 eof인지 확인하는 방법은 cin.eof()를 호출하여 cin의 버퍼가 fail이 되었는지 확인하는 방법이다.

 

만약 cin의 버퍼가 EOF임을 확인 먼저 하고 입력을 받게 된다면 위의 표와 같이 a b b 를 출력하게 되므로

 

cin을 먼저 받고 cin.eof()를 호출해야 a b 즉 우리가 원하는 부분에서 끝나게 된다.

 

cin >> X

cin.eof() 이 두 문장을 한번에 하고 싶다면

( cin >> X ).eof() 로 사용하면 된다.

 

혼자 공부한거라 틀린내용이 있을수 있습니다.

 

 

1. ios_base::sync_with_stdio(false);

C++ 에서 입출력을 하기위해

#include <iostream> 을 사용한다.

 

이때 iostream 라이브러리는 C++ 뿐만 아닌 C언어의 입출력 구문도 할수 있도록 동기화를 해준다.

즉 C언어의 stdio와 C++ 의 iostream 을 모두 가져온다.

 

 

단순하게 생각하면 모든 입출력 순간 stdio 와 iostream 인지 구분하고 그에 맞는 함수를 호출하는 동작을 할거 같음

 

 

그러므로 stdio를 비활성화 시킴으로 오직 C++의 iostream만 사용해 시간을 줄이는 방법인거 같음.

 

 

 

2. cin.tie(NULL);

위와 같은 문장을 수행하면 name을 입력 받기전에 Enter name : 문장이 출력되고 name을 받게 된다.

즉 cout 수행이 완료되기 전까지 즉 cout구문이 완전히 출력된때까지 cin을 받을수 없다. 

 

cout 동작에 대충 설명하자면 cout 버퍼로 출력할 데이터를 보내고 자동으로 출력 함수를 호출하여 화면에 출력해준다.

 

cin은 위의 cout의 출력 동작이 된것을 확인하고 그 이후에 데이터를 받게된다.

 

하지만 cin.tie(null)을 수행하면 cout과 cin의 연결을 풀어서 출력의 수행 여부와 상관 없이 데이터를 받을수 있게된다.

 

즉 "Enter name:" 이 나오기 전에 사용자의 입력을 받을수도 있다.

 

cin.tie(null)을 사용 했을때도 cout과 cin의 순서를 유지시키고 싶다면 std::flush나  std::endl 를 추가해서 사용해야한다.

 

하지만 이를 너무 많이 사용하면 cin.tie(null) 쓴거랑 안쓴거랑 별 차이 없다.

 

 

cin.tie(null)은 cout과 cin을 같이 사용안할때, 또는 작은 값들을 여러번 받아올때 사용하면 속도 개선에 긍정적인 영향을 줄거같음 ㅇㅅㅇ..

 

 

3. endl 대신 개행문자 사용 ( \n )

보통 개행문자 \n은 문자열을 출력할때 사용할수 있어 주로 endl 을 사용했었는데

 

이또한 속도에서 차이가 있다 ㅇㅅㅇ..

 

아직 모든것을 이해 못했지만

 

\n과 endl 모두 버퍼를 출력하는  연산을 수행한다.

 

endl은 cout의 버퍼를 출력하고 비워주는 flush() 함수까지 호출한다.

 

하지만 \n 은 버퍼만 출력하고 flush()는 안하므로 좀더 빠른 수행

 

 

 

 

 

+ Recent posts