[CPP] 템플릿 STL

STL

http://en.cppreference.com/w/Main_Page
1. 컨테이너 (vector, list, stack, queue, set, ...)의 이터레이터 (iterator)

컨테이너.begin()과 컨테이너.end()

이터레이터++
*이터레이터

#include <vector>
using namespace std;
vector<int> container;
vector<int>::iterator p;

for(int i=1; i<=4; i++) 
   container.push_back(i);

for(p = container.begin(); p != container.end(); p++) {
    cout << *p << " ";
    *p = 0;
    cout << *p << " ";
}
cout << endl;
  • 각 컨테이너는 서로 다른 종류의 이터레이터를 제공

(1) 단방향 (forward iterarors)

 p++

(2) 양방향 (bidirectional iterators)

p++, p--

(3) 임의접근 (random-access iterators)

p++, p--, p[2], *(p+2)
 (cf. container[2] vs. p[2])
p = container.begin();
cout << container[2] << endl; // 3번째 요소
cout << p[2] << endl; // 3번째 요소
cout << *(p + 2) << endl; // 3번째 요소
p++;
p++;
cout << *p << endl; // 3번째 요소
p--;
cout << *p << endl; // 2번째 요소

(4) 읽기만 되는 (read-only iterators)

*p = ...; 를 허용하지 않음

vector<int>::const_iterator q;
 for (q = container.begin(); q != container.end(); q++)
 cout << *q << " ";
 cout << endl;

q = container.begin();
 *q = 0; // 컴파일 에러

(5) 읽고 쓸 수 있는 (mutable iterators)

(6) 역방향 (reverse iterators)

vector<int>::reverse_iterator rp;

for (rp = container.rbegin(); rp != container.rend(); rp++)
   cout << *rp << " ";

cout << endl;
 
// 역방향 이터레이터로 오인하는 예제
 for(p = container.end(); p != container.begin(); p--)
     ...
  1. 컨테이너
  • 순차 컨테이너(sequential containers)
    : 순서대로 원소들을 나열해서 저장하는 컨테이너  list, vector, deque
#include <list>
#include <algorithm>
using namespace std;

list<int> l = { 7, 5, 16, 8 };
l.push_front(25);
l.push_back(13);

auto it = find(l.begin(), l.end(), 16);
if (it != l.end())
l.insert(it, 42);

for (int n : l)
 cout << n << " ";

cout << endl;

 

  • 컨테이너 어댑터(container adapters)
    : 다른 컨테이너를 사용해서 만든 응용 컨테이너
    (예: stack<int> 스택 컨테이너는 데큐 컨테이너를 디폴트로 사용
    stack<int, vector<int> > 스택 컨테이너는 벡터 컨테이너를 사용)

stack, queue, priority_queue

#include <stack>
using namespace std;

stach<char> s;
char next;

cin.get(next);
while (next != '\n') {
   s.push(next);
   cin.get(next);
}

while ( !s.empty() ) {
   cout << s.top();
   s.pop();
}
cout << endl;
  • 연합 컨테이너(associative containers)
    : 키와 값의 쌍으로 이루어진 구조

set, map

(set 템플릿은 키와 값이 동일하게 취급하는 간단한 형태의 연합 컨테이너)

#include <set>
using namespace std;

set<char> s;

s.insert('A');
s.insert('D');
s.insert('D'); // 이미 집합에 포함된 원소는 새로 추가하지 않음
s.insert('C');
s.insert('C'); // 이미 집합에 포함된 원소는 새로 추가하지 않음
s.insert('B');

set<char>::const_iterator;

for(p = s.begin(); p != s.end(); p++)
   cout << *p << " ";
cout << endl;

if( s.find('C') == s.end() )
   cout << "Not found..." << endl;
else
   cout << "Found..." << endl;

s.erase('C');




#include<map>
using namespace std;

map<string,string> planets;
planets["Mercury"] = "Hot planet"; // 수성
planets["Venus"] = "Atmosphere of sulfuric acid"; // 금성
planets["Earth"] = "Home"; // 지구
planets["Mars"] = "Alien planet"; // 화성
planets["Jupiter"] = "largest planet in our solar system"; // 목성
planets["Saturn"] = "Has rings"; // 토성
planets["Uranus"] = "Tilts on its side"; // 천왕성
planets["Neptune"] = "1500 mile-per-hour winds"; // 해왕성
planets["Pluto"] = "Dwarf planet"; // 명왕성

cout << planets["Mercury"] << endl;

if (planets.find("Mercury") != planets.end())
    cout << "Mercury is in the map." << endl;

// map은 키를 기준으로 정렬하므로
// Earth, Jupiter, Mars, ... 순서로 출력됨

map<string, string>::const_iterator iter;
for (iter = planets.begin(); iter != planets.end(); iter++)
    cout << iter->first << " - " << iter->second << endl;

// map템플릿은 pair템플릿을 이용하여 원소를 저장
// pair 템플릿은 쌍을 나타나는 클래스를 만들어내고
// first,second가 각각의 원소를 저장하는 멤버변수이다.

 

  1. (제네릭) 알고리즘

내용을 읽는 알고리즘

  •  find
  •  count
  •  equal
  •  search
  •  binary_search

내용을 변경할 수 있는 알고리즘

  • copy
  • remove
  • reverse
  • random_shuffle

집합 알고리즘

  • includes
  • set_union
  • set_intersection
  • set_difference

정렬 알고리즘

  • sort
  • merge

[예제] 특별한 단어(예: $$$$$)를 기준으로 이전에 입력된 단어들과 이후에 입력된 단어들의 교집합을 구하는 프로그램.

 

#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <iterator>
using namespace std;

int main() {
    set<string> set1;
    set<string> set2;
    string word;

    bool b = false;
    while (cin >> word) {
       if (word == "$$$$$") /// $$$$$ 이전까지 단어를 set1에
           b = true; // 이후 단어를 set2에 넣고 교집합을 구하기
       else {
           if (b == false)
                set1.insert(word);
           else
                set2.insert(word);
        }
    }

    cout << "Set 1" << endl;

    for (set<string>::iterator p = set1.begin(); p != set1.end(); p++)
         cout << *p << " ";
    cout << endl << endl;


    cout << "Set 2" << endl;

    for (set<string>::iterator p = set2.begin(); p != set2.end(); p++)
         cout << *p << " ";
    cout << endl << endl;

    set<string> set3;
    set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(),
    std::inserter(set3,set3.begin()));

    cout << "Set 1 cup Set 2" << endl;

    for (set<string>::iterator p = set3.begin(); p != set3.end(); p++)
         cout << *p << " ";
    cout << endl << endl;

    return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *