μμ±μ : λ°μ¬μ©
- C++μ κΈ°λ³Έ! STLμ΄ λ¬΄μμΈμ§ μ΄ν΄νκΈ°
- STLμ μ§μ μ¬μ©ν΄λ³΄κΈ°
Table of Contents
STLμ Standard Template Libraryλ‘ C++λ₯Ό μν νμ€ λΌμ΄λΈλ¬λ¦¬λ‘μ 컨ν
μ΄λ, λ°λ³΅μ, μκ³ λ¦¬μ¦ κ·Έλ¦¬κ³ ν¨μμλΌκ³ λΆλ¦¬λ λ€κ°μ§μ ꡬμ±μμλ₯Ό μ 곡νλ€. (C++ : Black Book)
C++μμ vector, queue λ± λ€μν λΌμ΄λΈλ¬λ¦¬λ€μ #include νμ¬ μ¬μ©ν μ μ΄ μλκ°? μ΄κ²λ€μ΄ STLμ μΌλΆμ΄λ€.
μ΄μ°½κΈ° STLμ μ΄μ ν μ±λ₯κ³Ό λ²κ·Έμ μν΄μ κ°λ°μλ€μ νΈμμ λμ΄λΌ μ μμμ§λ§ μ΅κ·Όμλ STL μμ΄ C++μ λ Όν μ μμλ§νΌ μ€μν΄μ‘λ€. STLμ μ¬μ©ν¨μΌλ‘μ ν¨μ¨μ μΈ νλ‘κ·Έλλ°μ΄ κ°λ₯ν΄μ‘λ€.
μΌλ°μ μΌλ‘ 컨ν
μ΄λλ λ€λ₯Έ κ°μ²΄λ€μ 보κ΄νλ νλμ 컀λ€λ 보κ΄μλΌκ³ λ³Ό μ μλ€. STL 컨ν
μ΄λμ κ²½μ° ν΄λμ€ ν
νλ¦Ώμ ννλ‘ κ΅¬νλμ΄ μκΈ° λλ¬Έμ μμμ νμ
μμλ€μ μν 컨ν
μ΄λλ₯Ό λ§λ€ μ μλ€. νμ€ λΌμ΄λΈλ¬λ¦¬μμλ μ¬λ¬κ°μ§ ννμ 컨ν
μ΄λλ₯Ό μ 곡νλ€.
μνμ€ μ»¨ν
μ΄λ - Sequence Container
ex)
vector, deque, array, priority_queue, list
μ°κ΄ 컨ν μ΄λ - Associative Container
ex)
set, map, multiset, multimap, unordered_set, unordered_map
iterator
ν¬μΈν°μ λΉμ·ν κ°λ μΌλ‘ 컨ν μ΄λμ μμλ₯Ό κ°λ¦¬ν€κ³ , κ°λ¦¬ν€λ μμμ μ κ·Όνμ¬ μνκ° κ°λ₯ν λ°λ³΅μ. ꡬ체μ μΌλ‘ μ€λͺ νμλ©΄ 컨ν μ΄λμμ 보μ νλ λ΄λΆ λ°μ΄ν°λ₯Ό μνν μ μλ κ°μ²΄λ‘ 컨ν μ΄λμ νΉμ μμΉλ₯Ό λνλΈλ€. C++μμλ μμ§ μλ£λ₯Ό ν¬μΈν° λ¨μλ‘ κ΄λ¦¬νκΈ°μ ν΄λΉ μλ£μ μμΉμμ λ°μ΄ν°μ μ κ·Όνκ³ μ¬μ©νκΈ° μν΄μ κ·Έ μμΉμ μ μ₯λ μλ£κ΅¬μ‘°λ₯Ό μ½λλ° λ°λ³΅μκ° νμνλ€.
ex1)
begin()
- 컨ν μ΄λμ 첫λ²μ§Έ μμΉλ₯Ό κ°λ¦¬ν€λ λ°λ³΅μλ₯Ό λ°ν
ex2)
end()
- 컨ν μ΄λμ λ§μ§λ§ μμΉλ₯Ό κ°λ¦¬ν€λ λ°λ³΅μλ₯Ό λ°ν
- *μ°μ°μ : μ§κΈ νμ¬ μμΉμ μμλ₯Ό λ°ν
- ++μ°μ°μ : 컨ν μ΄λμ λ€μ μμλ₯Ό κ°λ¦¬ν€λ μμΉλ‘ λ°λ³΅μκ° μ΄λ
- --μ°μ°μ : 컨ν μ΄λμ μ΄μ μμλ₯Ό κ°λ¦¬ν€λ μμΉλ‘ λ°λ³΅μκ° μ΄λ
- = μ°μ°μ : λ°λ³΅μκ° μ°Έμ‘°νλ μμμ μμΉλ₯Ό λ€λ₯Έ λ°λ³΅μμ ν λΉ
- ==, != μ°μ°μ : λΉκ΅ μ°μ°μ
μ λ ¬, μμ , κ²μ, μ°μ° λ±μ ν΄κ²°νλ μΌλ°νλ λ°©λ²μ μ 곡νλ ν¨μ Template
-
κ³μ μκ³ λ¦¬μ¦ count(), count_if()
μ£Όμ΄μ§ κ°κ³Ό μΌμΉνκ±°λ, 쑰건μ λ§λ μμλ€μ κ°μλ₯Ό count -
νμ μκ³ λ¦¬μ¦ search(), search_n(), find(), find_if(), find_end(), binary_search()
μ£Όμ΄μ§ κ°κ³Ό μΌμΉνκ±°λ, 쑰건μ λ§λ μμλ₯Ό λ°ν -
λΉκ΅ μκ³ λ¦¬μ¦ equal(), mismatch(), lexicographical_compare()
λκ°μ μμκ° κ°μμ§ λΉκ΅ -
μ΄κΈ°ν μκ³ λ¦¬μ¦ fill(), generate()
μ§μ λ λ²μμ μμλ₯Ό μ§μ ν κ°μΌλ‘ ν λΉ λ° ν¨μμ λ°ν κ° ν λΉ -
λ³κ²½ μκ³ λ¦¬μ¦ for_each(), transform()
μ§μ λ λ²μμ λͺ¨λ μμμ λν μ°μ°κ³Ό ν¨μ μ μ© -
λ³΅μ¬ μκ³ λ¦¬μ¦ copy()
νλμ ꡬκ°μ λ€λ₯Έ ꡬκ°μΌλ‘ λ³΅μ¬ -
μμ μκ³ λ¦¬μ¦ remove(), unique()
μ§μ λ κ°μ κ°μ§λ μμλ₯Ό μμ νκ±°λ, μ€λ³΅λ μμλ₯Ό μμ -
λμΉ μκ³ λ¦¬μ¦ replace()
μ§μ λ ꡬκ°μμ μμκ° μ§μ λ κ°κ³Ό μΌμΉνλ©΄ λμΉκ°μΌλ‘ λ°κΏ -
μ λ ¬ μκ³ λ¦¬μ¦ sort()
μ§μ λ μ λ ¬ κΈ°μ€μ λ°λΌμ ꡬκ°μ μμλ€μ μ λ ¬ -
λΆν μκ³ λ¦¬μ¦ partition()
μ§μ λ ꡬκ°μ μμλ€μ 쑰건μ λ°λΌμ λκ°μ μ§ν©μΌλ‘ λλ
μ΄λ¬ν κ²λ€μ΄ STLμ κΈ°λ³ΈμΌλ‘ λ΄μ₯λ μκ³ λ¦¬μ¦μ΄λΌλ μ λ§ C++ STLμ΄ λλμ§ μμκ°?
STL ν¨μμλ ν¨μ κ°μ²΄μ κ°μ λ§λ‘, operator() μ°μ°μλ₯Ό μ€λ²λ‘λ©ν ν΄λμ€ κ°μ²΄μ΄λ€.
μ°λ¦¬κ° C++μ μ¬μ©ν λ
sort(v.begin(), v.end(), less<int>());
μ μΈλ²μ§Έ μΈμ less, greaterλ₯Ό μ¬μ©νλ κΈ°μ΅μ΄ μλκ°?
μ΄κ²μ΄ λ°λ‘ ν¨μμ²λΌ λμνλ κ°μ²΄μΈ ν¨μμμ΄λ€.
μ°λ¦¬μ κ°μ C++ κ°λ°μλ ν¨μμλ₯Ό μ΄μ©ν ν¨μλ₯Ό λ§μ΄ μ¬μ©νμ§ μλλ€. ν¨μ ν¬μΈν°λ₯Ό μΈμλ‘ μ¬μ©νμ κ²½μ°μ λ¨μ μ λ°νκ°κ³Ό μΈμκ° λμΌν ν¨μμ λν΄μλ§ λμνκΈ° λλ¬Έμ λ²μ©μ±μ΄ λ¨μ΄μ§κΈ° λλ¬Έμ΄λ€.
λΉκ΅ μ°μ° κΈ°λ₯μ μννλ ν¨μμ
less(), greater(), equal_to(), greater_equal() λ±μ΄ μ‘΄μ¬νλ€.
μ°μ μ°μ° κΈ°λ₯μ μννλ ν¨μμ
plus(), minus(), multiplies(), divides() λ±μ΄ μ‘΄μ¬νλ€.
λ
Όλ¦¬ μ°μ° κΈ°λ₯μ μννλ ν¨μμ
logical_and(), logical_or(), logical_not() λ±μ΄ μ‘΄μ¬νλ€.
#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
using namespace std;
void main( )
{
vector<int> v1;
vector<int> v2;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v2.push_back(1);
v2.push_back(2);
v2.push_back(3);
for(int i = 0 ; i < v1.size() ; i++)
cout << v1[i] << " "; // 10, 20, 30
cout << endl;
for(int i = 0 ; i < v2.size() ; i++)
cout << v2[i] << " "; // 1, 2, 3
cout << endl;
transform(v1.begin(), v1.end(), v2.begin(), v1.begin(), plus<int>());
for(int i = 0 ; i < v1.size() ; i++)
cout << v1[i] << " "; // 11, 22, 33
cout << endl;
}
μ΄λν°λ 컨ν μ΄λμ μΈν°νμ΄μ€ λλ ν¨μμμ κΈ°λ₯μ λ³κ²½νλ μ»΄ν¬λνΈλ₯Ό λ§νλ€. κΈ°μ‘΄μ 컨ν μ΄λλ₯Ό μ΄μ©ν΄μ μ€νμ κΎΈλ―Έκ³ μΆμ λμλ μ€ν μ΄λν°λ₯Ό, ν¨μμμ μλ―Έλ₯Ό λ³κ²½ν λλ λ°μΈλλ λΆμ μλ₯Ό μ¬μ©νλ€.
-
λ°μΈλ(binder)
λκ°μ μΈμλ₯Ό νμλ‘ νλ μ΄ν ν¨μ κ°μ²΄μ μΈμ νλλ₯Ό κ³ μ μμΌ μΈμλ₯Ό νλλ§ μꡬνλ λ¨ν ν¨μ κ°μ²΄λ‘ λ³ν -
λΆμ μ(negator)
ν¨μ μΈμλ‘ μ¬μ©λλ 쑰건μμ μλ―Έλ₯Ό λ°λλ‘ λ³ν -
ν¨μ ν¬μΈν° μ΄λν°(adaptors for pointers to functions)
λ¨νμ΄λ μ΄ν ν¨μ ν¬μΈν°λ₯Ό λΌμ΄λΈλ¬λ¦¬κ° μ 곡νλ ν¨μ μ΄λν°μ μ¬μ©ν μ μλλ‘ λμ -
λ©€λ² ν¨μ ν¬μΈν° μ΄λν°(adaptors for pointers to member functions)
λ¨νμ΄λ μ΄ν λ©€λ² ν¨μ ν¬μΈν°λ₯Ό λΌμ΄λΈλ¬λ¦¬κ° μ 곡νλ ν¨μ μ΄λν°μ μ¬μ©ν μ μλλ‘ λμ
-
bind1st
ν¨μμμ μ λ¬λλ λκ°μ μΈμ μ€ μ²«λ²μ§Έ μΈμλ₯Ό κ³ μ κ°μΌλ‘ μ¬μ©ν μ μλλ‘ λμμ£Όλ λ°μΈλ -
bind2nd
ν¨μμμ μ λ¬λλ λκ°μ μΈμ μ€ λλ²μ§Έ μΈμλ₯Ό κ³ μ κ°μΌλ‘ μ¬μ©ν μ μλλ‘ λμμ£Όλ λ°μΈλ
less ν¨μμμ bind1st μ΄λν°λ₯Ό μμ΄ μμ
#include <iostream>
#include <functional>
using namespace std;
int main(void){
// 첫 μΈμλ₯Ό 10μΌλ‘ κ³ μ
binder1st<less<int>> binder = bind1st (less<int>(), 10);
cout << binder(5) << ':' << less<int>()(10, 5) << endl;
cout << binder(10) << ':' << less<int>()(10, 10) << endl;
cout << binder(20) << ':' << less<int>()(10, 20) << endl;
cout << "== ==" << endl;
// μμ κ°μ²΄ μ¬μ©
cout << bind1st(less<int>(), 10) (5) << ':' << less<int>()(10, 5) << endl;
cout << bind1st(less<int>(), 10) (10) << ':' << less<int>()(10, 10) << endl;
cout << bind1st(less<int>(), 10) (20) << ':' << less<int>()(10, 20) << endl;
}
μ€ν κ²°κ³Ό
0:0
0:0
1:1
== ==
0:0
0:0
1:1
- not1
μΈμλ‘ μ λ¬λ λ¨ν 쑰건μμ μλ―Έλ₯Ό λ°λλ‘ λ³ν
5μ λ°°μμΈμ§ νμΈνλ isMulti5 ν¨μλ₯Ό λ§λ€μλ€κ³ κ°μ νμ λ not1(isMulti5()); μ μ¬μ©νλ©΄ 5μ λ°°μκ° μλκ²λ§ νμΈνκ² λλ€.
- not2
μΈμλ‘ μ λ¬λ μ΄ν 쑰건μμ μλ―Έλ₯Ό λ°λλ‘ λ³ν
ex)
sort(v.begin(), v.end(), compare());
μ μ€λ¦μ°¨μμ΄λΌκ³ κ°μ νμ λ `sort(v.begin(), v.end(), not2(compare())); μ λ΄λ¦Όμ°¨μμ΄ λλ€.
ν¨μ ν¬μΈν°λ κ°μ²΄κ° μλλ―λ‘ μ΄λν°λ₯Ό μ μ©ν μ μλλ° μλμ ν¨μ ν¬μΈν° μ΄λν°λ₯Ό μ¬μ©ν¨μΌλ‘μ¨ ν¨μ ν¬μΈν°λ₯Ό κ°μ²΄λ‘ ν¬μ₯νκ² λκ³ μ΄ ν λ°μΈλ, λΆμ μ λ±μ μ΄λν°λ₯Ό μ μ©ν μ μλ€.
- ptr_fun
λ¨ν ν¨μλ₯Ό ν¨μ μ΄λν°μ²λΌ μ¬μ©ν μ μλλ‘ μ§μ
bool IsMultiFunc(int a,int b)
{
return (a % b == 0);
}
void main(){
int ari[]={1,2,3,4,5,6,7,8,9,10};
vector<int> vi(&ari[0],&ari[10]);
vector<int>::iterator it;
for (it=vi.begin();;it++) {
it=find_if(it, vi.end(), bind2nd(ptr_fun(IsMultiFunc),3));
if (it==vi.end()) break;
cout << *it << "μ΄(κ°) μλ€" << endl;
}
}