안녕하세요! 코딩하는 경제학도 쏘코입니다.

 

지난 게시물에서 Map에 대해 다룬 적이 있었죠?

이번 Set은 Map과 굉장히 유사한 친구입니다. 오히려 Map보다 더 단순화된 형태이죠.

(Set을 이해하면 Map을 이해하는 데 도움이 될 수 있습니다.

 

Map에 대해 먼저 포스팅을 올린 나는 특이케이스

 

혹시나 Set을 알아보려고 왔다가 Map이 궁금해지셨다면 아래 포스팅에서 추가로 확인하실 수 있습니다.

 

[C++ STL] Map 사용설명서

안녕하세요! 코딩하는 경제학도 쏘코입니다. 작년 2학기에 자료구조 수업을 들으면서 여러 자료구조를 짜면서 STL의 위대함을 느꼈습니다. 여러 알고리즘을 보다보니 다양한 STL들에 대해서도 간

ssocoit.tistory.com

목차


    0. Set의 기본 개념

    Set은 Key라고 불리는 원소들의 집합으로 이루어진 컨테이너입니다.

    그리고 이 Key값들은 중복될 수 없죠.

    또한 Set은 Key값의 순서대로 정렬이 됩니다. 그리고 완전정렬입니다. 이 말은 원소의 삽입 순서에 영향을 받지 않는다는 이야기입니다. (파이썬의 set은 순서가 없습니다! 주의하세요!)

    (만약 정렬이 되지 않는 set을 원한다면 C++11부터 지원하는 unordered_set을 사용하시면 됩니다.)

     

    Set은 Map과 동일하게 이진균형트리구조를 이룹니다. 따라서 검색, 삽입, 삭제에는 평균 O(logN) 시간이 들게 됩니다. (균형이 붙었기 때문에 삽입이나 삭제 시 추가적인 시간이 소요될 수 있습니다)

     

    균형이진트리의 예 / 출처 : https://casterian.net/archives/217

    ※ Set의 특징 정리

    • key값은 중복될 수 없습니다. (복수의 key값을 사용기 위해서는 multiset을 사용해야합니다)
    • 자동으로 오름차순으로 정렬됩니다. (unordered_set의 경우 정렬이 되지 않습니다)
    • 동적할당합니다. (필요에 따라 메모리를 사용합니다)

     

    set의 예시, key값에 따라 정렬이 된 모습


    1. Set의 사용법

    사용을 위해서는 당연히 #include <set>헤더 파일을 적어야 합니다.

    map과 동일하게 using namespace std;를 통해 편하게 사용하실 수 있습니다.

     

    include 후에는 set<key속성> 변수이름; 형태로 사용하실 수 있습니다.

    key값에는 원하는 속성을 담으시면 됩니다.

     

    set<int> set1;

    set<char> set2;

    set<string> set3;

     

    만약 기본 오름차순 정렬을 원하지 않는다면 key 속성 뒤에 greater<key 속성>을 넣어주면 내림차순으로 정렬됩니다.

    물론 원하는 기준을 따로 만들어서 사용하셔도 무방합니다.

    크기가 작으면 앞에 오도록, 같으면 사전순으로 정렬되도록 만들었습니다.

     

    set<int, greater<int>> set4;

     

    bool lengthcomp(const string& left, const string& right){

      if(left.size() != right.size())

        return left.size() < right.size();

      else

        return left < right;

    };

    int main(){

      set<string, lengthcomp> set5;

      return 0;

    }

     

     

    추가로 cplusplus에서 확인할 수 있는 set의 기본 형식은 다음과 같습니다. 위의 Alloc는 allocator의 줄임말로, 동적할당을 도와주는 요소입니다. 입력하지 않으면 기본으로 사용되는 allocator는 알게 모르게 메모리 관리를 할 때 유용하게 사용되고 있습니다. 


    2. Set의 멤버함수

    iter, start, end 세 개의 반복자를 선언하며, k와 l은 일반 원소입니다!

    멤버

    설명

    begin()

    첫 번째 원소의 랜덤 접근 반복자를 반환

    end()

    마지막 원소 다음의 반복자를 반환

    empty()

    저장 하고 있는 요소가 없으면(비어있으면) True 반환

    clear()

    저장하고 있는 모든 원소를 삭제

    erase(iter), erase(start,end), erase(key)

    특정 위치의 원소나 지정 범위의 원소들을 삭제 후 다음 원소를 가리키는 반복자를 반환, 지정한 key와 같은 요소를 지우고 삭제된 개수 반환 (multiset이 아닌 set이라면 1 반환) 

    find(k)

    key와 연관된 원소의 반복자 반환 (없으면 end()와 같은 반복자 반환)

    insert(k), insert(iter,k), insert (first, last)

    key 추가, iter 위치에 k라는 원소 추가, first부터 last까지 추가

    upper_bound(k)

    지정한 key 요소를 가지고 있다면 해당 위치의 다음 위치의 반복자를 반환

    lower_bound(k)

    지정한 key의 요소를 가지고 있다면 해당 위치의 반복자를 반환

    rbegin()

    역방향으로 첫 번째 원소의 반복자를 반환

    rend()

    역방향으로 마지막 원소 다음의 반복자를 반환

    size()

    원소의 개수를 반환

     

    map과의 차이점이 있다면 set에서는 operator[]를 사용할 수 없습니다.

    이 말은 map에서 사용하던 방식인 map1[1] = 10;과 같은 방식으로 요소를 삽입하거나

    cout << map1[1]; 과 같은 방식으로 요소를 출력할 수 없다는 이야기입니다.

    set은 key만으로 구성되어 있기 때문에, 따로 출력을 위해서는 for문 안에 iterator를 불러와서 출력해야겠네요.

     

     

    ▼ 아래는 set을 출력하는 예제입니다. 

    #include <iostream>
    #include <set>
    
    using namespace std;
    
    int main() {
        set<int> set1;
        set1.insert(1);
        set1.insert(3);
        set1.insert(2);
        
        for (auto it = set1.begin(); it != set1.end(); ++it)
            cout << *it << " ";
    
        return 0;
    }

    정렬되어 출력되는 모습!!


    3. 참고자료

    www.cplusplus.com/reference/set/set/

     

    set - C++ Reference

    difference_typea signed integral type, identical to: iterator_traits ::difference_type usually the same as ptrdiff_t

    www.cplusplus.com

    en.cppreference.com/w/cpp/container/set

     

    std::set - cppreference.com

    template<     class Key,     class Compare = std::less ,     class Allocator = std::allocator > class set; (1) (2) (since C++17) std::set is an associative container that contains a sorted set of unique objects of type Key. Sorting is done using the

    en.cppreference.com

    www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS6470125680

     

    About STL : C++ STL 프로그래밍(8)-셋(Set)

    제공 : 한빛 네트워크저자 : 최흥배이전기사 :About STL : C++ STL 프로그래밍(1)About STL : C++ STL 프로그래밍(2-1)About STL : C++ STL 프로그래밍(2-2)About STL : C++ STL 프로그래밍(3)About STL : C++ STL 프로그래밍(4)Ab

    www.hanbit.co.kr

     

    반응형
    • 네이버 블로그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기