인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Inflearn Community Q&A

zkrhklkl98's profile image
zkrhklkl98

asked

10-Week C++ Coding Test | Algorithm Coding Test

항상 감사합니다 unique() 함수 질문있습니다

Written on

·

290

·

Edited

1

빨리 교안마무리하고싶은데 마음과 달리 잘 안되네요 ㅠㅠ 그래도 어렵다고 소문난 cpp를 배우고 있다는것에 감사합니다

제가 막히는 코드는 이러합니다.

#include <bits/stdc++.h>

using namespace std;

vector<int> v;

int main () {

for(int i = 1; i <= 5; i++){

v.push_back(i);

v.push_back(i);

}

for(int i : v) cout << i << " ";

cout << '\n';

// 중복되지 않은 요소로 채운 후, 그 다음 이터레이터를 반환한다.

auto it = unique(v.begin(), v.end());

//질문1. 여기서 v.begin()의 값과 v.end()값을출력하려면 어떻게 해야하나요? cout << v.begin() << '\n'; 을 해봤는데 되지 않더라구요

//질문2. v의 첫번째 값과 마지막값이 1과 5 아닌가요? v.begin() 과 v.end() 대신 1 과 5 를 어봤는데 에러가 났습니다

// 질문3. auto it 대신 int it 과 vector<int> it 을 넣어봤는데 에러가 납니다. 정확한 타입을 알고싶어서 cout << typeid(it).name() << '\n' 을 했었는데 에러는 아니지만 'N9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEE' 가 출력되었습니다. 어떻게하면 타입을 확인할수 있을까요?

 

cout << it - v.begin() << '\n';

//질문 4. it-v.begin() 을 왜 하는지와 출력값이 왜 5인지 이해가되지 않습니다..

// 앞에서 부터 중복되지 않게 채운 후 나머지 요소들은 그대로 둔다.

for(int i : v) cout << i << " ";

cout << '\n';

return 0;

}

 

 

C++코테 준비 같이 해요!

Answer 1

1

kundol님의 프로필 이미지
kundol
Instructor

안녕하세요 ㅎㅎ

//질문1. 여기서 v.begin()의 값과 v.end()값을출력하려면 어떻게 해야하나요? cout << v.begin() << '\n'; 을 해봤는데 되지 않더라구요

>> begin이나 end는 이터레이터를 반환합니다. 그래서 출력이 그대로는 안됩니다. 교안 - 이터레이터 설명 참고 부탁드립니다.

//질문2. v의 첫번째 값과 마지막값이 1과 5 아닌가요? v.begin() 과 v.end() 대신 1 과 5 를 어봤는데 에러가 났습니다

>> 무슨 말씀인가요? 1과 5를 넣어본 코드를 질문에 다시 올려주실 수 있으실까요?

// 질문3. auto it 대신 int it 과 vector<int> it 을 넣어봤는데 에러가 납니다. 정확한 타입을 알고싶어서 cout << typeid(it).name() << '\n' 을 했었는데 에러는 아니지만 'N9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEE' 가 출력되었습니다. 어떻게하면 타입을 확인할수 있을까요?

>> 정확한 타입은 "해당 자료형의 이터레이터"입니다.

예를 들어볼까요?

#include<bits/stdc++.h>
using namespace std; 
int main(){
	vector<int> a; 
	for(int i = 0; i < 10;i++){
		a.push_back(i);
	}    
	for(vector<int>::iterator it = a.begin(); it != a.end(); it++){
		cout << *it << "\n";
	} 
}
/*
0
1
2
3
4
5
6ㅇ
7
8
9
*/

cout << it - v.begin() << '\n';

//질문 4. it-v.begin() 을 왜 하는지

>> 이터레이터는 주소값을 반환합니다. 저걸 꼭 해야 하는 이유는 없지만 몇번째까지인 것을 출력하기 위해서 하는 것입니다.

그니까 음.. 주소값이 설정될 때 1000정도로 설정되었다고 해봅시다. 여기서 1, 2, 3, 400, 100이 할당이 되면

1001, 1002, 1003, 1004, 1005 이런 식의 주소에 값이 할당이 되는 것이죠.

자, 여기서 100이 몇번째인지를 확인하려면 1005 - 1001을 해서 아 4번째임을 확인할 수 있습니다.

1 2 3 4 5 3 4 4 5 5

유니크를 돌린 배열의 값입니다.

유니크함수는 유니크하게 만들고 유니크한 배열 그 다음의 이터레이터를 반환합니다.

즉,

1 2 3 4 5 3 4 4 5 5

이 숫자에서

1 2 3 4 5 3 4 4 5 5

3이라는 숫자 위치를 반환합니다. 즉, 5번째인 것이죠.

 

와 출력값이 왜 5인지 이해가되지 않습니다..

>> 위에 설명드렸습니다.

 

또 질문 있으시면 언제든지 질문 부탁드립니다.

감사합니다.

강사 큰돌 올림.

zkrhklkl98's profile image
zkrhklkl98

asked

Ask a question