인프런 커뮤니티 질문&답변

Clain님의 프로필 이미지
Clain

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

교안 p85 stable_sort()

해결된 질문

작성

·

128

·

수정됨

1

안녕하세요! 교안 p85의 stable_sort() 예제 코드에서

#include <bits/stdc++.h>
using namespace std;

int main()
{
    // pair의 첫 번째 요소는 정렬한 값, 두 번째 요소는 원래 인덱스를 나타냄
    vector<pair<int, int>> pairs = {{5, 1}, {2, 2}, {5, 3}, {3, 4}, {2, 5}};

    cout << "Original: ";
    for (const auto &p : pairs)
    {
        cout << "(" << p.first << ", " << p.second << ") ";
    }
    cout << "\n";

    sort(pairs.begin(), pairs.end());

    cout << "Sorted with sort: ";
    for (const auto &p : pairs)
    {
        cout << "(" << p.first << ", " << p.second << ") ";
    }
    cout << "\n";

    // 원본 데이터로 초기화
    pairs = {{5, 1}, {2, 2}, {5, 3}, {3, 4}, {2, 5}};

    // stable_sort 사용
    stable_sort(pairs.begin(), pairs.end());

    cout << "Sorted with stable_sort: ";
    for (const auto &p : pairs)
    {
        cout << "(" << p.first << ", " << p.second << ") ";
    }
    cout << "\n";

    return 0;
}
for (const auto &p : pairs)
    {
        cout << "(" << p.first << ", " << p.second << ") ";
    }

여기에서 pairs에 들어있는 타입(pair<int, int>)이 왜 const auto &인지 궁금합니다!

또 교안 p83의 예제 코드에서

#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int>> v;
int main()
{
    for (int i = 10; i >= 1; i--)
    {
        v.push_back({i, 10 - i});
    }

    sort(v.begin(), v.end());

    for (auto it : v)
        cout << it.first << " : " << it.second << "\n";

    return 0;
}

위의 for 문에서 pair<int, int>를 받을 때는 auto 로 받는데,

두 예제가 같은 pair<int, int> 타입을 받을 때 for (const auto &p : pairs) 와 for (auto it : v) 로 다른 이유가 무엇인지 알고싶습니다!

답변 2

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 clain님 ㅎㅎ

그리구 참고로.. clain님 의견을 좀 듣고 const 부분의 설명이 좀 부족한 것 같아서 교안내에 해당 부분이 다음과 같이 수정되었습니다. (좀 더 자세하게 수정됨.)

 

다음과 같이 함수매개변수로 넘겼을 때 매개변수 수정도 방지할 수 있습니다. x = 100으로 바꾼다면 에러가 발생합니다.

#include <bits/stdc++.h>
using namespace std;
void printConstRef(const int& x) {
   
// x = 100; // 에러발생, 여기서 x는 매개변수로 받아온 const int x를 참조
   
cout << x;
}
int main() {
   
int x = 10;
    printConstRef(x);

   
return 0;
}


다음과 같이 범위기반 for반복문에 넣었을 때 상수로 만드는 기능을 합니다. 이 때 value를 수정하며 에러가 발생합니다. 

[참고] &의 의미는 교안내 1.9 참조의 의한 호출을 설명을 참고해주세요.


#include <bits/stdc++.h>
using namespace std
int main() {
   
vector<int> vec = {10, 20, 30, 40, 50};
   
for (const int& value : vec) {
       
cout << value << " ";
       
// value = 100; // 에러발생, value는 const 참조
    }

   
return 0;
}


[참고] 범위기반 for반복문은 교안내 1.8 범위기반 for루프를 참고해주세요. 


교안은 지금 다시 다운받으시면 최신 교안을 다운 받으실 수 있습니다. 😀

 

감사합니다.

Clain님의 프로필 이미지
Clain
질문자

정말 감사합니다..ㅠㅠ 지나칠 수 있는 부분인데도 빠르게 반영해주시고 섬세하게 교안을 매번 업그레이드 해주셔서, 큰돌님 정성으로 더욱 완강해야겠다는 의지가 불타지네요 :)

정말 감사합니다! 열심히 하겠습니다.

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 clain님 ㅎㅎ

일단 교안내의 다음 부분 참고 부탁드립니다.

 

  • const 키워드

  • auto 타입

  • 1.9 값의 의한 호출과 참조에 의한 호출

또한, 차이점은 다음과 같습니다.

  • const auto &ppairs 컨테이너의 각 요소를 상수 참조로 순회합니다. 이는 반복 중인 p의 값(여기서는 pairfirstsecond 값)을 변경할 수 없음을 의미합니다. 즉, 이 루프 내에서 p.firstp.second를 변경하려고 시도하면 에러가 발생합니다. 즉, 해당 루프내에서 변경을 안 할거면 const o, 그게 아니라면 const x라고 보시면 됩니다.

     

 

감사합니다.

Clain님의 프로필 이미지
Clain
질문자

답변 감사합니다! 교안 내의 검색을 먼저 했어야했는데 그럼에도 친절하게 설명해주셔서 이해되었습니다!! 감사합니다ㅎㅎ

Clain님의 프로필 이미지
Clain

작성한 질문수

질문하기