set 컨테이너

  • 헤더 < set > 에 저장되어 있다.
  • keyvalue가 쌍으로 저장됩니다.
  • 노드 기반으로 이루어져 균형 이진 트리 구조 입니다.
  • key는 고유한 값이므로 중복이 불가능하지만, multiset 에서 중복을 지원합니다.
  • compare 부분을 지정해주지않으면 삽입이 되면서 자동으로 정렬이 됩니다. (default 로 오름차순)
  • 저장공간 필요에 따라서 allocator 객체 사용 (동적 할당을 위해서)

set 템플릿 구조.

template < class T,                        // set::key_type/value_type
           class Compare = less<T>,        // set::key_compare/value_compare
           class Alloc = allocator<T>      // set::allocator_type
           > class set;

멤버함수

  • construtor 제공, destructor 제공.
  • operator = 할당자함수도 제공한다.

Capacity

  • empty();
    • size가 0이면 리턴 true, 아니면 리턴 false
  • size();
    • 원소의 개수를 리턴한다.
  • max_size();
    • 컨테이너가 보유할 수 있는 최대 요소 수 리턴.

반복자

  • begin();
    • 맨 첫번째 원소를 가르키는 반복자를 리턴
  • end();
    • 맨 마지막 원소를 가르키는 원소의 끝부분의 반복자를 리턴.
  • rbegin();
  • rend();
    • begin 과 end의 반대로 작동함.
  • cbegin();
  • cend();
  • crbegin();
  • crend();
    • 위의 것들과 동일하지만 const 키워드가 추가됨으로 써 가리키는 내용을 수정하는데 사용할 수 없다.

수정

  • insert(iter, k);
    • iter가 가르키는 위치부터 k를 삽입할 위치를 탐색하여 삽입.
  • erase();
    • erase(iter) -> iter가 가르키는 원소를 제거하고 그다음 원소를 가르키는 iter를 리턴.
    • erase(start, end) -> [start,end) 범위의 원소를 모두 제거.
  • swap();
    • set.swap(set2); -> set2와 set1을 바꿔준다.
  • clear();
    • 모든 원소를 제거하고 size0으로 남는다.
  • emplace();
    • insert와 비슷하지만 삽입과 동시에 생성이 이루어짐.

Observers

  • key_comp();
  • value_comp();
    • 둘다 모두 정렬 기준 조건자를 리턴한다.

기능들

  • find(key);
    • key 값을 가르키는 반복자를 리턴. 만약 없다면 end()와 같은 반복자 리턴.
  • count(key);
    • key 값의 개수를 리턴한다. 0개 아니면 1개 key값은 중복이 불가능하기 때문.
  • lower_bound(key);
    • key가 시작하는 구간의 반복자를 리턴.
  • upper_bound(key);
    • key가 끝나는 구간의 반복자를 리턴
  • equal_range(key);
    • key가 시작하는 구간과 끝나는 구간의 pair 객체를 반환.
    • upper_bound(key)와 lower_bound(key)가 합쳐진 함수.

Examples

다양한 생성 방법

// constructing sets
#include <iostream>
#include <set>

bool fncomp (char lhs, char rhs) {return lhs<rhs;}

struct classcomp {
  bool operator() (const char& lhs, const char& rhs) const
  {return lhs<rhs;}
};

int main ()
{
  std::set<char,int> first;

  first['a']=10;
  first['b']=30;
  first['c']=50;
  first['d']=70;

  std::set<char,int> second (first.begin(),first.end());

  std::set<char,int> third (second);

  std::set<char,int,classcomp> fourth;                 // class as Compare

  bool(*fn_pt)(char,char) = fncomp;
  std::set<char,int,bool(*)(char,char)> fifth (fn_pt); // function pointer as Compare

  return 0;
}

insert

// set::insert (C++98)
#include <iostream>
#include <set>

int main ()
{
  std::set<char,int> myset;

  // first insert function version (single parameter):
  myset.insert ( std::pair<char,int>('a',100) );
  myset.insert ( std::pair<char,int>('z',200) );

  std::pair<std::set<char,int>::iterator,bool> ret;
  ret = myset.insert ( std::pair<char,int>('z',500) );
  if (ret.second==false) {
    std::cout << "element 'z' already existed";
    std::cout << " with a value of " << ret.first->second << '\n';
  }

  // second insert function version (with hint position):
  std::set<char,int>::iterator it = myset.begin();
  myset.insert (it, std::pair<char,int>('b',300));  // max efficiency inserting
  myset.insert (it, std::pair<char,int>('c',400));  // no max efficiency inserting

  // third insert function version (range insertion):
  std::set<char,int> anotherset;
  anotherset.insert(myset.begin(),myset.find('c'));

  // showing contents:
  std::cout << "myset contains:\n";
  for (it=myset.begin(); it!=myset.end(); ++it)
    std::cout << it->first << " => " << it->second << '\n';

  std::cout << "anotherset contains:\n";
  for (it=anotherset.begin(); it!=anotherset.end(); ++it)
    std::cout << it->first << " => " << it->second << '\n';

  return 0;
}

Output:

myset contains: 5 10 15 20 24 25 26 30 40 50

equal range

#include <iostream>
#include <set>

int main ()
{
  std::set<int> myset;

  for (int i=1; i<=5; i++) myset.insert(i*10);   // myset: 10 20 30 40 50

  std::pair<std::set<int>::const_iterator,std::set<int>::const_iterator> ret;
  ret = myset.equal_range(30);

  std::cout << "the lower bound points to: " << *ret.first << '\n';
  std::cout << "the upper bound points to: " << *ret.second << '\n';

  return 0;
}

Output:

the lower bound points to: 30
the upper bound points to: 40

자세한 내용은 아래의 레퍼런스 참조 하세용
click reference site

Comments