STLμ΄λ?
C++ STL(Standard Template Library)μ C++ νμ€ λΌμ΄λΈλ¬λ¦¬μ μ€μν κ΅¬μ± μμ μ€ νλλ‘, μ¬λ¬ μ μ©ν λ°μ΄ν° ꡬ쑰μ μκ³ λ¦¬μ¦μ μ 곡νλ 컬λ μ
μ
λλ€. STLμ C++ νμ€μ΄λ―λ‘ C++ μΈμ΄μ λ΄μ₯λμ΄ μμΌλ©°, λ§μ C++ μ»΄νμΌλ¬μ νκ²½μμ μ¬μ©ν μ μμ΅λλ€.
STLμ ν΅μ¬ μμ΄λμ΄λ 'ν
νλ¦Ώ(Template)'μ μ¬μ©νμ¬ μ λ€λ¦(generic)ν λ°©μμΌλ‘ ꡬνλ λ°μ΄ν° ꡬ쑰μ μκ³ λ¦¬μ¦μ μ 곡νλ κ²μ
λλ€. μ΄λ κ² κ΅¬νλ STL 컨ν
μ΄λμ μκ³ λ¦¬μ¦μ νΉμ μλ£νμ μ’
μλμ§ μκ³ , λ€μν μλ£νμ λν΄ μ¬μ¬μ©λ μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ½λμ μ¬μ¬μ©μ±κ³Ό μΌλ°μ±μ λμΌ μ μμ΅λλ€.
STLμ μ£Όλ‘ λ€μκ³Ό κ°μ μΈ κ°μ§ μμλ‘ κ΅¬μ±λ©λλ€.
1. 컨ν
μ΄λ (Containers): λ°μ΄ν°λ₯Ό μ μ₯νκ³ κ΄λ¦¬νλ ν΄λμ€λ€λ‘, λ°°μ΄, 리μ€νΈ, ν΄μ ν
μ΄λΈ λ± λ€μν ννμ λ°μ΄ν° ꡬ쑰λ₯Ό μ 곡ν©λλ€. μ£Όμ 컨ν
μ΄λλ‘λ vector, list, set, map, unordered_set, unordered_map λ±μ΄ μμ΅λλ€.
2. λ°λ³΅μ (Iterators): 컨ν
μ΄λμ μμμ μ κ·Όνκ³ μννλ λ°©λ²μ μΆμννλ ν΄λμ€ λλ κ°μ²΄μ
λλ€. λ°λ³΅μλ₯Ό μ¬μ©νμ¬ μ»¨ν
μ΄λμ μμμ μ κ·Όνκ³ μμ ν μ μμ΅λλ€.
3. μκ³ λ¦¬μ¦ (Algorithms): 컨ν
μ΄λμμ μμ
μ μννλ ν¨μλ€μ μ§ν©μ
λλ€. μ λ ¬, κ²μ, 볡μ¬, λ³ν λ± λ€μν μμ
μ μννλ ν¨μλ€μ΄ μμΌλ©°, μ΄λ¬ν μκ³ λ¦¬μ¦λ€μ 컨ν
μ΄λμ λ
립μ μΌλ‘ μλν©λλ€.
STLμ μ¬μ©νλ©΄ λ°μ΄ν° ꡬ쑰μ μκ³ λ¦¬μ¦μ ꡬνν νμ μμ΄ μ΄λ―Έ ꡬνλμ΄ μλ 컨ν
μ΄λμ μκ³ λ¦¬μ¦μ νμ©νμ¬ νλ‘κ·Έλλ°ν μ μμ΅λλ€. μ΄λ κ°λ°μλ€μ΄ ν¨μ¨μ μ΄κ³ μμ μ μΈ μ½λλ₯Ό μ½κ² μμ±ν μ μλλ‘ λμμ€λλ€.
STL 컨ν μ΄λ
C++ STL(Standard Template Library)μ C++ νμ€ λΌμ΄λΈλ¬λ¦¬μ μ€μν λΆλΆμΌλ‘, λ€μν μ μ©ν λ°μ΄ν° ꡬ쑰μ μκ³ λ¦¬μ¦μ μ 곡νμ¬ κ°λ°μλ€μ΄ ν¨μ¨μ μΌλ‘ νλ‘κ·Έλ¨μ μμ±ν μ μλλ‘ λμμ€λλ€. STLμ ν¬κ² λ€μκ³Ό κ°μ μΈ κ°μ§ μ£Όμ 컨ν
μ΄λ μ’
λ₯λ‘ κ΅¬μ±λ©λλ€.
1. Sequence Containers(μμ°¨ 컨ν
μ΄λ):
- vector: λμ λ°°μ΄(Dynamic Array)λ‘ ν¬κΈ°λ₯Ό λ³κ²½ν μ μμΌλ©° λΉ λ₯Έ μμ μ κ·Όμ μ§μν©λλ€.
- list: μ΄μ€ μ°κ²° 리μ€νΈ(Doubly Linked List)λ‘ μμμ μ½μ
κ³Ό μμ κ° λΉλ²ν κ²½μ°μ μ μ©ν©λλ€.
- deque: λ±(Deque)μ μμͺ½ λμμ μμλ₯Ό μ½μ
/μμ νλ λ° ν¨μ¨μ μΈ λλΈμλλ ν(Double-ended Queue)μ
λλ€.(κ·Έλ₯ queueλ λΉμ°ν μμ΅λλ€.)
- array: κ³ μ ν¬κΈ° λ°°μ΄λ‘, ν¬κΈ°κ° λ³κ²½λμ§ μμ΅λλ€. C μ€νμΌ λ°°μ΄λ³΄λ€ μμ νκ³ νΈλ¦¬ν©λλ€.
2. Associative Containers(μ°κ΄ 컨ν
μ΄λ):
- set: μ€λ³΅μ νμ©νμ§ μλ μμμ μ λ ¬λ μ§ν©μ
λλ€.
- multiset: μ€λ³΅μ νμ©νλ μμμ μ λ ¬λ μ§ν©μ
λλ€.
- map: ν€μ κ°μ μ°κ²°νμ¬ ν€λ₯Ό κΈ°μ€μΌλ‘ μ λ ¬λ μ§ν©μ
λλ€.
- multimap: ν€μ κ°μ μ°κ²°νλλ° μ€λ³΅μ΄ νμ©λλ μ λ ¬λ μ§ν©μ
λλ€.
3. Unordered Containers(λΉμ λ ¬ μ°κ΄ 컨ν
μ΄λ):
- unordered_set: μ€λ³΅μ νμ©νμ§ μλ ν΄μ(Hash) κΈ°λ° μ§ν©μ
λλ€.
- unordered_multiset: μ€λ³΅μ νμ©νλ ν΄μ κΈ°λ° μ§ν©μ
λλ€.
- unordered_map: ν€μ κ°μ μ°κ²°νλλ° ν΄μ κΈ°λ°μΌλ‘ λμνλ 맡μ
λλ€.
- unordered_multimap: ν€μ κ°μ μ°κ²°νλλ° μ€λ³΅μ΄ νμ©λλ ν΄μ κΈ°λ° λ§΅μ
λλ€.
STL 컨ν
μ΄λλ€μ κ°κ°μ νΉμ§μ κ°μ§κ³ μμ΅λλ€. κ·Έλ¬λ―λ‘ μ μ ν 컨ν
μ΄λλ₯Ό μ ννλ κ²μ΄ μ€μν©λλ€. λͺ κ°μ§ μ€μν νΉμ§μ λ€μκ³Ό κ°μ΅λλ€:
1. λ©λͺ¨λ¦¬ κ΄λ¦¬: vectorλ λμ λ°°μ΄μ μ¬μ©νλ―λ‘ λ©λͺ¨λ¦¬ μ¬μ©μ΄ ν¨μ¨μ μ
λλ€. listμ dequeλ κ°κ° μ΄μ€ μ°κ²° 리μ€νΈμ λ±μ μ¬μ©νμ¬ μ½μ
/μμ μ μ©μ΄ν©λλ€.
2. μ λ ¬κ³Ό κ²μ: μ λ ¬λ λ°μ΄ν°λ₯Ό λ€λ£° λμλ set, map, unordered_set, unordered_mapλ³΄λ€ multiset, multimap, unordered_multiset, unordered_multimapμ΄ μ μ©ν©λλ€.
3. μ±λ₯: 컨ν
μ΄λλ€μ μλ‘ λ€λ₯Έ μ±λ₯ νΉμ§μ κ°μ§κ³ μμ΅λλ€. μλ₯Ό λ€μ΄, vectorλ μμ μ κ·Όμ΄ λΉ λ₯΄μ§λ§ μ€κ° μ½μ
/μμ κ° λ립λλ€. listλ μ€κ° μ½μ
/μμ κ° λΉ λ₯΄μ§λ§ μμ μ κ·Όμ΄ λ립λλ€.
4. μ€λ³΅ νμ© μ¬λΆ: setκ³Ό mapμ μ€λ³΅μ νμ©νμ§ μμ§λ§ multisetκ³Ό multimapμ μ€λ³΅μ νμ©ν©λλ€. unordered_setκ³Ό unordered_mapλ λμΌν μλ¦¬λ‘ μ€λ³΅ μ¬λΆκ° κ²°μ λ©λλ€.
STL 컨ν
μ΄λλ€μ μ΄μΈμλ λ€μν λ©€λ² ν¨μμ λ°λ³΅μ(Iterators)λ₯Ό μ 곡νμ¬ λ°μ΄ν°μ μ‘°μκ³Ό μ κ·Όμ μ©μ΄νκ² ν©λλ€. κ° μ»¨ν
μ΄λμ νΉμ§μ μ μ΄ν΄νκ³ νμμ λ§κ² μ ννμ¬ μ¬μ©νλ κ²μ΄ μ€μν©λλ€.
λ°λ³΅μ(Iterator)
STL(Standard Template Library)μμ λ°λ³΅μ(Iterator)λ 컨ν
μ΄λμ μμμ μ κ·Όνκ³ μννλ μΆμνλ μΈν°νμ΄μ€λ₯Ό μ 곡νλ κ°μ²΄μ
λλ€. λ°λ³΅μλ₯Ό μ¬μ©νλ©΄ 컨ν
μ΄λμ λ΄μ©μ μννκ±°λ μμ νλ λ±μ μμ
μ μΌλ°μ μΈ λ°©λ²μΌλ‘ μνν μ μμΌλ©°, μκ³ λ¦¬μ¦κ³Ό 컨ν
μ΄λλ₯Ό λΆλ¦¬νμ¬ μ¬μ©ν μ μλλ‘ ν©λλ€.
λ°λ³΅μλ ν¬μΈν°μ μ μ¬ν μΈν°νμ΄μ€λ₯Ό κ°μ§κ³ μμΌλ©°, μΌλ°μ μΌλ‘ λ€μκ³Ό κ°μ μ£Όμ κΈ°λ₯μ μ 곡ν©λλ€:
1. μμμ μ κ·Ό: λ°λ³΅μλ 컨ν
μ΄λμ μμμ μ κ·Όνλ μν μ μνν©λλ€. ν¬μΈν°μ²λΌ μμ°Έμ‘° μ°μ°μ(`*`)λ₯Ό μ¬μ©νμ¬ νμ¬ μμμ κ°μ κ°μ Έμ¬ μ μμ΅λλ€.
2. μμ μ΄λ: `++` μ°μ°μλ₯Ό μ¬μ©νμ¬ λ€μ μμλ‘ μ΄λν μ μμ΅λλ€. μ΄λ κ² λ°λ³΅μλ₯Ό μ΄λμν€λ κ²μ "μν(iteration)"λΌκ³ ν©λλ€.
3. λΉκ΅: λ°λ³΅μλ€λΌλ¦¬μ μλμ μΈ μμΉλ₯Ό λΉκ΅ν μ μμ΅λλ€. `==`, `!=`, `<`, `>`, `<=`, `>=` μ°μ°μλ€μ μ¬μ©νμ¬ λΉκ΅ν©λλ€.
STLμμλ λ€μν μ’
λ₯μ λ°λ³΅μλ€μ΄ μ 곡λλ©°, 컨ν
μ΄λμ μ’
λ₯μ μμ
μ νΉμ±μ λ°λΌ μ μ ν λ°λ³΅μλ₯Ό μ νν μ μμ΅λλ€. μ£Όμ λ°λ³΅μ μ’
λ₯λ‘λ λ€μκ³Ό κ°μ΅λλ€:
1. Input Iterator: μ½κΈ° μ μ©μΌλ‘ 컨ν
μ΄λμ μμλ₯Ό μνν©λλ€. μννλ©° μμλ₯Ό μμ ν μ μμ΅λλ€.
2. Output Iterator: μ°κΈ° μ μ©μΌλ‘ 컨ν
μ΄λμ μμλ₯Ό μΆκ°νκ±°λ μμ ν©λλ€.
3. Forward Iterator: μλ°©ν₯μΌλ‘λ§ μ΄λν μ μμΌλ©° μ½κΈ° λ° μ°κΈ°κ° κ°λ₯ν©λλ€.
4. Bidirectional Iterator: μλ°©ν₯μΌλ‘ μ΄λν μ μμΌλ©°, μλ°©ν₯κ³Ό μλ°©ν₯μΌλ‘μ μ΄λμ΄ λͺ¨λ κ°λ₯ν©λλ€.
5. Random Access Iterator: μμ μ κ·Όμ΄ κ°λ₯νλ©°, μΈλ±μ€λ₯Ό μ΄μ©ν΄ μμμ O(1) μκ°μ μ κ·Όν μ μμ΅λλ€. ν¬μΈν°κ° μ΄μ ν΄λΉν©λλ€.
STL μκ³ λ¦¬μ¦μ λ°λ³΅μλ₯Ό ν΅ν΄ 컨ν
μ΄λμ μμλ€μ μννκ³ μ²λ¦¬νκΈ° λλ¬Έμ, λ°λ³΅μμ μ¬μ©μ STLμ κ°λ ₯ν κΈ°λ₯ μ€ νλμ
λλ€. λ°λ³΅μλ₯Ό μ΄ν΄νκ³ μ μ ν νμ©νλ©΄ λ³΄λ€ ν¨μ¨μ μ΄κ³ μΌλ°μ μΈ μκ³ λ¦¬μ¦μ μμ±ν μ μμ΅λλ€.
STL λ©μλ
1. vector μ¬μ© λ©μλ
#include <vector>
#include <iostream>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// μμ μΆκ°
numbers.push_back(6);
// μμ κ°μ μΆλ ₯
std::cout << "Size: " << numbers.size() << std::endl;
// μμ μ κ·Ό
std::cout << "First Element: " << numbers[0] << std::endl;
// λ°λ³΅μλ₯Ό μ¬μ©ν μμ μν
for (auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
2. map μ¬μ© λ©μλ
#include <map>
#include <iostream>
int main() {
std::map<std::string, int> scores;
// μμ μΆκ°
scores["Alice"] = 100;
scores["Bob"] = 85;
scores["Charlie"] = 90;
// μμ κ°μ μΆλ ₯
std::cout << "Size: " << scores.size() << std::endl;
// μμ μ κ·Ό
std::cout << "Bob's score: " << scores["Bob"] << std::endl;
// λ°λ³΅μλ₯Ό μ¬μ©ν μμ μν
for (auto it = scores.begin(); it != scores.end(); ++it) {
std::cout << it->first << ": " << it->second << std::endl;
}
return 0;
}
3. algorithm λΌμ΄λΈλ¬λ¦¬μ λ©μλ
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> numbers = {5, 2, 8, 1, 3};
// μ λ ¬
std::sort(numbers.begin(), numbers.end());
// νΉμ κ° μ°ΎκΈ°
int target = 8;
auto it = std::find(numbers.begin(), numbers.end(), target);
if (it != numbers.end()) {
std::cout << target << " found at index: " << std::distance(numbers.begin(), it) << std::endl;
} else {
std::cout << target << " not found." << std::endl;
}
// ν©κ³ κ³μ°
int sum = std::accumulate(numbers.begin(), numbers.end(), 0);
std::cout << "Sum: " << sum << std::endl;
return 0;
}
4. μνλ μμ μ°ΎκΈ°(find, find_if, count, count_if)
// find
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
int target = 3;
auto it = std::find(numbers.begin(), numbers.end(), target);
if (it != numbers.end()) {
std::cout << target << " found at index: " << std::distance(numbers.begin(), it) << std::endl;
} else {
std::cout << target << " not found." << std::endl;
}
return 0;
}
// find_if
#include <algorithm>
#include <vector>
#include <iostream>
bool isEven(int num) {
return num % 2 == 0;
}
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
auto it = std::find_if(numbers.begin(), numbers.end(), isEven);
if (it != numbers.end()) {
std::cout << "First even number: " << *it << std::endl;
} else {
std::cout << "No even number found." << std::endl;
}
return 0;
}
// count
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> numbers = {1, 2, 3, 2, 4, 5, 2};
int target = 2;
size_t count = std::count(numbers.begin(), numbers.end(), target);
std::cout << target << " appears " << count << " times." << std::endl;
return 0;
}
// count_if
#include <algorithm>
#include <vector>
#include <iostream>
bool isEven(int num) {
return num % 2 == 0;
}
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
size_t count = std::count_if(numbers.begin(), numbers.end(), isEven);
std::cout << "Number of even numbers: " << count << std::endl;
return 0;
}
std::find_ifμ Predicate, κ·Έλ¦¬κ³ λλ€ν¨μ
Predicate
Predicateλ 쑰건μ νλ³νλ ν¨μ κ°μ²΄ λλ ν¨μ ν¬μΈν°λ₯Ό μΌλ°μ μΌλ‘ κ°λ¦¬ν€λ μ©μ΄μ
λλ€. Predicate ν¨μλ λ³΄ν΅ μ°Έ λλ κ±°μ§μ λ°νν©λλ€. STL μκ³ λ¦¬μ¦μμλ find_ifμ κ°μ ν¨μλ€μ΄ Predicateλ₯Ό μ¬μ©νμ¬ μμλ₯Ό κ²μνκ±°λ μ λ ¬νλ λ±μ μμ
μ μνν©λλ€.
Predicate ν¨μλ μ£Όμ΄μ§ 쑰건μ λ°λΌ μμλ₯Ό μ ννκ±°λ κ±Έλ¬λ΄λλ° μ¬μ©λλ©°, λλ€ ν¨μλ ν¨μ κ°μ²΄λ‘ μμ±νμ¬ νμ©ν μ μμ΅λλ€. μ΄λ¬ν κ°λ
λ€μ ν¨κ» μμ©νλ©΄ STL μκ³ λ¦¬μ¦μ λ§€μ° μ μ°νκ² μ¬μ©ν μ μμ΅λλ€.
λλ€ ν¨μ (Lambda Function)
λλ€ ν¨μλ κ°λ¨ν μ΅λͺ
ν¨μλ‘μ, ν¨μλ₯Ό μ μΈνμ§ μκ³ λ°λ‘ μ¬μ©ν μ μλ κΈ°λ₯μ
λλ€. μ£Όλ‘ ν¨μ κ°μ²΄λ₯Ό κ°νΈνκ² μμ±ν λ μ¬μ©λ©λλ€.
[μΊ‘μ² λ¦¬μ€νΈ](맀κ°λ³μ 리μ€νΈ) -> λ°νν {
// ν¨μ λ΄μ©
}
μΊ‘μ² λ¦¬μ€νΈ: ν¨μ μΈλΆμ λ³μλ₯Ό ν¨μ λ΄λΆμμ μ¬μ©νκΈ° μν΄ μΊ‘μ²νλ λͺ©λ‘μ
λλ€.
맀κ°λ³μ 리μ€νΈ: ν¨μμ 맀κ°λ³μλ₯Ό μ μΈνλ λΆλΆμ
λλ€.
λ°νν: ν¨μμ λ°ννμ μ μΈνλ λΆλΆμ
λλ€. μλ΅ κ°λ₯νλ©°, μ»΄νμΌλ¬κ° λ°ννμ μΆλ‘ ν©λλ€.
{} μμλ λλ€ ν¨μμ λμμ ꡬννλ μ½λκ° λ€μ΄κ°λλ€.
λλ€ ν¨μλ μ£Όλ‘ find_ifμ ν¨κ» μ¬μ©νμ¬ μ§§κ³ κ°λ¨ν 쑰건 ν¨μλ₯Ό μμ±νλ λ° μ μ©ν©λλ€.
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// λλ€ ν¨μλ₯Ό μ¬μ©νμ¬ μ§μλ₯Ό μ°Ύλ Predicateλ₯Ό μμ±
auto it = std::find_if(numbers.begin(), numbers.end(), [](int num)
{ return num % 2 == 0; });
if (it != numbers.end()) {
std::cout << "First even number: " << *it << std::endl;
} else {
std::cout << "No even number found." << std::endl;
}
return 0;
}
μ μμμμ μ΅λͺ λλ€ ν¨μλ₯Ό μ¬μ©νμ¬ Predicateλ₯Ό μμ±νκ³ , find_ifμ μ΄ Predicateλ₯Ό μ λ¬νμ¬ μ»¨ν μ΄λμμ 첫 λ²μ§Έ μ§μλ₯Ό μ°Ύμμ΅λλ€. μ΄λ κ² Predicateμ λλ€ ν¨μλ₯Ό μ‘°ν©νλ©΄ νμμ λ°λΌ λ€μν 쑰건μΌλ‘ 컨ν μ΄λμ μμλ₯Ό μ²λ¦¬ν μ μμ΅λλ€.
'C++ κΈ°μ΄' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[C++] 20. λ©ν° μ€λ λ νλ‘κ·Έλλ°(Multi-Threads) (0) | 2023.08.18 |
---|---|
[C++] 19. μ°μ°μ μ€λ²λ‘λ©(Operator Overloading) (0) | 2023.08.07 |
[C++] 17. μμΈμ²λ¦¬(Exception), std::exception (0) | 2023.07.23 |
[C++] 16-3. μμ(Inheritance)κ΄κ³μ μΈμ€ν΄μ€ μμ±, μλ©Έ (0) | 2023.06.29 |
[C++] 16-2. λ€νμ±(Polymorphism)κ³Ό μΆμ ν΄λμ€(Abstract Class) (0) | 2023.06.24 |
λκΈ