Author | Created | Updated |
mcha(Min-jae Cha) | 2022. 07. 25. | 2022. 08. 25. |
C++ containers, EASY MODE
The standard C++ containers have all a specific usage. To make sure you understand them, letβs re-implement them!
Β Intro
CPP Moduleμ μννλ€λ³΄λ©΄ λ°μ΄ν°λ₯Ό μ μ₯ν μ μλ CPPμ μ¬λ¬ Containerλ₯Ό μ ν μ μλ€.
λ³Έ κ³Όμ μ μν λͺ©μ μ CPP containerμ μ©λμ νΉμ§μ νμ
νλ©° μ¬κ΅¬μ±, ꡬν νλ κ²μ΄λ€.
Β Before to go
1. Compile time polymorphism
CPPμλ λ€νμ±(Polymorphism)μ΄λΌλ κ°λ
μ΄ μ‘΄μ¬νλ€. μλ§ CPP Module κ³Όμ λ₯Ό μννλ©° μ΄ λ€νμ± κ°λ
μ 곡λΆν κ²½νμ΄ μμ κ²μ΄λ€.
λ€νμ±μ ν΅ν΄ ν¨μλ₯Ό κ²°μ νλ μμ μ΄ λ κ°κ° μ‘΄μ¬νλλ° μ²« λ²μ§Έλ μ»΄νμΌ(Compile) νμ λ, λ λ²μ§Έλ λ°νμ(Runtime) λμ΄λ€.
κ°μ μ΄λ¦μ ν¨μλ₯Ό μ¬λ¬ κ° λ§λ€μ΄ ν보ꡰμ λλ ν¨μ μ€λ²λ‘λ©(Overloading)μ μ»΄νμΌ(Compile) λ, λΆλͺ¨ ν΄λμ€μ ν¨μλ₯Ό μ¬μ μ ν ν¨μλ₯Ό μ¬μ©νλ μ€λ²λΌμ΄λ©(Overriding)λ λ°νμ(Runtime) λ κ²°μ λλ€.
μμ
// Compile time
int add(int, int);
int add(int, int, int); //number of parameters different
double add(double, double); //type of parameters different
// Runtime
#include <iostream>
using namespace std;
class base {
public:
virtual void display() {
cout<<"Function of base class"<<endl;
}
};
class derived : public base {
public:
void display() {
cout<<"Function of derived class"<<endl;
}
};
C++
볡μ¬
λ³Έ κ³Όμ λ₯Ό μννλ€λ³΄λ©΄ μ»΄νμΌ νμ λ ν¨μ μ€λ²λ‘λ© λΏλ§ μλλΌ ν
νλ¦Ώμ νμ©ν νμ
μΆλ‘ , ν
νλ¦Ώ λ©ν ν¨μ λ± λ§μ μμ
μ΄ μ΄λ£¨μ΄μ§κ³ κ·Έ μ½λκ° λ§μ κ²μ μ μ μλλ°, μ»΄νμΌ νμμ μμ κ°μ μμ
μ΄ μλ°λ λ λνλλ μ₯μ μ΄ λ¬΄μμ΄ μλμ§ μμ보μλ€.
μ»΄νμΌ νμ λ μμ
μ μννλ©΄ μ€ν μκ°μ΄ ν¬κ² μ€μ΄λλ μ₯μ μ΄ μλ€. staticκ³Ό κ°μ μ μ κ°μ μ»΄νμΌ νμ λ κ³μ°λκΈ° λλ¬Έμ λ°νμ λ μ΄λ¬ν κ³μ° μμ
μ ν¬κ² μ€μΌ μ μλ€. λν΄μ λ§μ½ μ€λ μκ°μ΄ 걸리λ 루ν μ€νλ¬Έμ μ»΄νμΌ νμ λ μννλ€λ©΄ λ§μ°¬κ°μ§λ‘ λ°νμμ μ€μΌ μ μλ€. μ΄λ¬ν λ°©λ²μ κ°λ ₯ν μ΅μ ν λ°©λ²μΌλ‘ μκ°λκ³ μλ€. νμ§λ§ μ΄ κ°μ κ²½μ° μ€μ΄λ λ°νμ λ§νΌ μ»΄νμΌ νμμ΄ κΈΈμ΄μ§ μ μλ€λ λ¨μ λ μ‘΄μ¬νλ€.
λ°νμ λ λ°μν μ μλ μμΈ‘νμ§ λͺ»ν μ€λ₯λ₯Ό μ»΄νμΌ νμ λ μ‘μ μ μλ€λ μ₯μ λ μ‘΄μ¬νλ€. CPPλ ν
νλ¦Ώμ ν΅ν λ€νμ±(Polymorphism)μ ꡬννλλ° μ΄ ν
νλ¦Ώ νλ‘κ·Έλλ°μ μ»΄νμΌ νμ λ μ½λλ₯Ό μμ±ν΄μ£Όμ΄ λ°νμ λ λ©λͺ¨λ¦¬μ μν μκ°μ ν¬κ² μ€μΌ μ μλ μ₯μ μ΄ μλ€. νμ§λ§ λ§μ½ μ»΄νμΌ νμ λ ν
νλ¦Ώ μμ
μ μννμ§ μλλ€λ©΄ μ μ νμ§ μμ νμ
μ΄ λ€μ΄μμ λ μκΈ°μΉ λͺ»ν μν©μ΄ λ°μν μ μλ€.
μμ
template <typename _Type>
void example(void)
{
_Type &a;
a.fnc(); // λ§μ½ _Type λ΄μ fncλΌλ ν¨μκ° μ‘΄μ¬νμ§ μλλ€λ©΄?
}
C++
볡μ¬
2. SFINAE
Substitution failure is not an errorμ μ½μλ‘, βλ체 μ€ν¨λ μ€λ₯κ° μλλ€βλΌλ λ»μ΄λ€.
νλμ ν¨μ μ΄λ¦μ μ¬μ©νμ¬ μ¬λ¬ μμ
μ μννκ³ μ ν λ ν¨μ μ€λ²λ‘λ ν보ꡰμ λ§λ λ€. κ·Έλ¦¬κ³ νλ³΄κ΅°μ΄ ν
νλ¦ΏμΌλ‘ μμ± λμλ€λ©΄ κ·Έ ν
νλ¦Ώ μΈμμ μλ£νμ΄λ κ°μ΄ λμ
μ΄ λλ κ²½μ°κ° μμ μ μλ€.
κ·Έ ν μ»΄νμΌ νμ λ μ μ ν ν보ꡰμ μ°Ύλ κ³Όμ μ΄ μν λλλ° λ§μ½ λ체 κ³Όμ μ€ μ€λ₯κ° λ°μν΄λ C++ νμ€μ΄ νμ©νλ€λ©΄ μ»΄νμΌλ¬λ μ»΄νμΌ μ€λ₯λ₯Ό λνλ΄μ§ μκ³ κ·Έ ν보λ₯Ό ν보ꡰμμ μ μΈνλ μμ
λ§ μννλ€.
μμ
#include <iostream>
struct TEST {
// rename int as test
typedef int test;
};
// 01
template <typename T> void fnc(typename T::test) {
std::cout << "Type in the structure" << std::endl;
}
// 02
// λ§μ½ μ΄ ν¨μκ° μλ€λ©΄, μλμ mainλ¬Έμ λ°λμ μ€λ₯λ₯Ό μΆλ ₯νλ€.
template <typename T> void fnc(T) {
std::cout << "Only typename T function" << std::endl;
}
int main(void) {
fnc<TEST>(10); // TEST μμ 'test'κ° μκΈ° λλ¬Έμ μ μμ μΌλ‘ μν
fnc<int>(10); // int μμ 'test'κ° μκΈ° λλ¬Έμ 'typename T::test'
// μμ μ€λ₯κ° λ°μνλ, SFINAEμ λ°λΌ ν보μμ μ μΈν¨
// μ΄ν λ체 ν¨μκ° λ¨μμμ΄ μ€λ₯ μμ΄ μ μ μν
return (0);
}
C++
볡μ¬
μλμ κ²½μ°λ SFINAE κ°λ
μ΄ μ μ μ© λ κ² μ²λΌ 보μΈλ€. νμ§λ§ 3W(-Wall -Werror -Wextra) μ΅μ
κ³Ό κ°μ΄ μ»΄νμΌμ ν΄λ³΄λ©΄ μλ¬κ° λ°μνλ κ²μ μ μ μλ€.
μμ
#include <iostream>
struct TEST {
// rename int as test
typedef int test;
};
template <typename T> void fnc(typename T::test) {
std::cout << "Type in the structure" << std::endl;
std::cout << sizeof(typename T::test) << std::endl; // diff
}
template <typename T> void fnc(T) {
std::cout << "Only typename T function" << std::endl;
std::cout << sizeof(typename T::test) << std::endl; // diff
}
int main(void) {
fnc<TEST>(10);
fnc<int>(10);
return (0);
}
C++
볡μ¬
μλνλ©΄ SFINAEκ° μ μ©λλ μμ μ λ²μ΄λ¬κΈ° λλ¬ΈμΈλ°, μ΄ λ¬Έμμ SFINAE νλͺ©μ 보면 λ€μκ³Ό κ°μ΄ κΈ°μ λμ΄ μλ€.
Only the failures in the types and expressions in theΒ immediate context of the function type or its template parameter typesΒ or itsΒ explicit specifier (since C++20)Β are SFINAE errors. If the evaluation of a substituted type/expression causes a side-effect such as instantiation of some template specialization, generation of an implicitly-defined member function, etc, errors in those side-effects are treated as hard errors.
ν¨μ μ ν λλ ν
νλ¦Ώ νλΌλ―Έν° μ ν λλ λͺ
μμ μ§μ μμ μ§μ μ μΈ λ§₯λ½μμ λ°μνλ μ€λ₯λ§ SFINAE μλ¬λ‘ μ·¨κΈνλ€. κ·Έλ¦¬κ³ λ체 μ΄νμ λ°μλλ μλ¬λ νλ μλ¬λ‘ μ·¨κΈνλ€.
λ°λΌμ void fnc(T) ν¨μ λ΄μ μΌλ° μ€νλ¬ΈμΈ sizeof(typename T::test) λ SFINAEμ λ²μ£Όμμ λ²μ΄λ μλ¬κ° λ°μνλ€.
3. ν νλ¦Ώ λ©ν ν¨μ
λ€μμΌλ‘ μ§ννκΈ° μ ν
νλ¦Ώ λ©ν ν¨μκ° λ¬΄μμΈμ§ μ νμκ° μλ€. ν
νλ¦Ώ λ©ν ν¨μλ μ»΄νμΌ νμμ ν¨μλ μλμ§λ§ λ§μΉ ν¨μμ²λΌ λμνλ ν
νλ¦Ώ ν΄λμ€λ€μ λ§νλ€. μΌλ° ν¨μλ κ°(Value)μ λν΄ μ°μ°νμ§λ§ ν
νλ¦Ώ λ©ν ν¨μλ νμ
(Type)μ λν΄ μ°μ°νλ€.
μμ 01
#include <iostream>
bool is_negative(int nbr)
{
if (nbr < 0)
return true;
return false;
}
int main(void)
{
if (is_negative(1))
{
std::cout << "negative" << std::endl;
}
else
{
std::cout << "positive" << std::endl;
}
return (0);
}
C++
볡μ¬
μμ μμ λ μΌλ° ν¨μλ₯Ό ν΅ν΄ νλΌλ―Έν°κ° μμμΈμ§ μμμΈμ§ ꡬλΆνλ μ½λμ΄λ€.
μμ 02
#include <iostream>
template <typename _Tp>
void catch_type()
{
if (std::is_void<_Tp>::value) // ν
νλ¦Ώ λ©ν ν¨μ
{
std::cout << "void" << std::endl;
}
else
{
std::cout << "not void" << std::endl;
}
}
int main(void)
{
catch_type<void>();
catch_type<int>();
return (0);
}
C++
볡μ¬
μμ 02λ catch_typeμ ν
νλ¦Ώμ μ¬μ©ν΄ ꡬννκ³ ifλ¬Έ λ΄μ is_void ν
νλ¦Ώ λ©ν ν¨μλ₯Ό ν΅ν΄ typeμ΄ voidμΈμ§ μλμ§λ₯Ό μΆλ ₯νλ μμμ΄λ€.
μ¬κΈ°μ is_voidλ type_traits λΌμ΄λΈλ¬λ¦¬ λ΄μ μλ κ΅¬μ‘°μ²΄λ‘ ν¨μμ²λΌ λμνλ ν
νλ¦Ώ ν΄λμ€(ꡬ쑰체)μ΄λ€.
type_traits λ νμ
μ λ°λΌ μ¬λ¬ μ°μ°μ μνν μ μλ ν
νλ¦Ώ λ©ν ν¨μλ₯Ό μ 곡νλ λΌμ΄λΈλ¬λ¦¬μ΄λ€.
// λͺ¨λ νμ
μ λμνλ ν
νλ¦Ώ λ©ν ν¨μ
template <class _Tp> struct __libcpp_is_void : public false_type {};
// void νμ
μλ§ λμνλ ν
νλ¦Ώ λ©ν ν¨μ
template <> struct __libcpp_is_void<void> : public true_type {};
// μμ __libcpp_is_voidλ₯Ό μμλ°λ is_void
template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_void
: public __libcpp_is_void<typename remove_cv<_Tp>::type> {};
C++
볡μ¬
Β κ³Όμ λ₯Ό μννλ©΄μ νΉν λμ λλ ν
νλ¦Ώ λ©ν ν¨μκ° μμλλ° μ 리λ₯Ό μν΄μ μλμ κΈ°λ‘μ λ¨κΈ΄λ€.
template <class _Tp, _Tp __v>
struct _LIBCPP_TEMPLATE_VIS integral_constant
{
static _LIBCPP_CONSTEXPR const _Tp value = __v; // __vλ₯Ό staticμΌλ‘ κ°μ§λ ν
.λ©.ν¨
typedef _Tp value_type;
typedef integral_constant type;
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR operator value_type() const _NOEXCEPT { return value; }
#if _LIBCPP_STD_VER > 11
_LIBCPP_INLINE_VISIBILITY
constexpr value_type operator()() const _NOEXCEPT { return value; }
#endif
};
C++
볡μ¬
integral_constantλ μ¬λ¬ ν
νλ¦Ώ λ©ν ν¨μλ₯Ό μ‘°ν©ν΄ 쑰건μ λ°μ§ λ λ§μ΄ μ¬μ©νλλ° μμλ λ€μκ³Ό κ°λ€.
template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_class
: public integral_constant<bool, __is_class(_Tp)> {};
C++
볡μ¬
μμμ μ¬μ©νλ is_voidμ²λΌ is_classλ ν΄λμ€μΈμ§ μλμ§λ₯Ό λνλ΄λ λ©ν ν¨μμ΄λ€.
if (std::is_class<_Tp>::value)
// μ΄ν μλ΅
C++
볡μ¬
μμ κ°μ΄ valueκ° trueμΈμ§ falseμΈμ§λ₯Ό λΉκ΅νλλ° μ΄ valueλ integral_constantμ valueμ΄λ€.
integral_constantμ valueλ __vμ κ°μλ°, is_classμ μμ ννλ₯Ό 보면 __is_class(_Tp)μ κ°μ κ²μ μ μ μλ€. κ²°λ‘ μ μΌλ‘ __is_class(_Tp)μ μ€ν κ΅¬μ‘°κ° μ΄λ»κ² λμ΄ μλμ§λ λͺ¨λ₯΄μ§λ§ μ΄ κ²°κ³Όκ°μ΄ integral_constantμ valueλ₯Ό κ²°μ μ§λ κ²μ μ μ μλ€.
4. enable_if
ν
νλ¦Ώ λ©ν ν¨μλ‘ SFINAE κ°λ
μ νμ©ν΄ 쑰건μ λ§μ§ μλ μ€λ²λ‘λ© ν¨μλ€μ ν보ꡰμμ μ μΈμμΌμ£Όλ μν μ μννλ€. μ²μμ enable_ifκ° SFINAEμ κ°λ€κ³ μκ°νμμ§λ§, enable_ifλ SFINAEλ₯Ό μ³κ² ꡬννλ λ°©λ² μ€ νλμ΄λ€. enable_ifλ μ¬λ¬ ν
νλ¦Ώ λ©νν¨μλ₯Ό μ‘°ν©ν΄ 쑰건μ λ§μ‘±νλ νμ
μ μΈμλ‘ λ°λ κ²μ λͺ©μ μΌλ‘ νλ€.
Prototype
template <bool, class _Tp = void> struct enable_if {};
template <class _Tp> struct enable_if<true, _Tp> {typedef _Tp type;};
C++
볡μ¬
enable_ifμ νλ‘ν νμ
μ λ κ°μ§κ° μ‘΄μ¬νλ€. κ²°λ‘ λ§ λ¨Όμ λ§νλ©΄ λ§μ½ enable_ifμ 첫 λ²μ§Έ ν
νλ¦Ώ μΈμμΈ boolμ΄ trueλΌλ©΄ enable_if::typeμ νμ
μ _Tpκ° λλ€. λ€μ λ§ν΄μ boolμ΄ trueλΌλ©΄ typeμ΄ μ‘΄μ¬νλ€λ κ²μ΄λ€.
μμ
#include <iostream>
#include <type_traits>
template <typename _Tp>
void catch_type(typename std::enable_if<std::is_void<_Tp>::value>::type * = 0)
{
if (std::is_void<_Tp>::value)
{
std::cout << "void" << std::endl;
}
else
{
std::cout << "not void" << std::endl;
}
}
int main(void)
{
catch_type<void>();
catch_type<int>(); // μ§μ°λ©΄ μ»΄νμΌ μ μμ μΌλ‘ λ¨
return (0);
}
C++
볡μ¬
enable_ifλ SFINAEλ₯Ό μ μ©ν λ°©λ² μ€ νλλΌκ³ νλ€. λ°λΌμ ν
νλ¦Ώ μΈμμλ ν¨μ μΈμμλ enable_ifλ₯Ό μ¬μ©ν μ μλ€. μλ ν¨μ νλΌλ―Έν°μ enable_ifλ₯Ό μ μ©ν λͺ¨μ΅μ΄λ€.
enable_if μμ is_void λ©ν ν¨μλ₯Ό μ μ©νλλ°, λ§μ½ _Tpκ° voidλΌλ©΄ valueκ° trueκ° λμ΄ enable_ifμ typeμ΄ μ‘΄μ¬νκ² λ κ²μ΄λ€. μμ μ½λλ₯Ό μ»΄νμΌ νμ λ μ€λ₯κ° λκ² λλλ°, μλνλ©΄ catch_type<int>() μ€ν ꡬ문μμ int νμ
μ voidκ° μλκΈ° λλ¬Έμ΄λ€.
μΆκ°μ μΈ μλ‘ λ²‘ν°μ μμ±μλ₯Ό λ€μ΄λ³΄κ² λ€.
// 1.
vector (size_type n, const value_type& val);
// 2.
template <class InputIterator>
vector (InputIterator first, InputIterator last);
// μμ±ν μ€νλ¬Έ
vector<int> _v(10, 3);
C++
볡μ¬
벑ν°μ μμ±μκ° 1λ²κ³Ό 2λ² λ κ°κ° μκ³ λ§μ§λ§μ λ²‘ν° _vλ₯Ό μμ±νλ μ€νλ¬Έμ μμ±νμλ€.
μμ μ€νλ¬Έμ 1λ² μμ±μλ₯Ό μ€νν κΉ μλλ©΄ 2λ² μμ±μλ₯Ό μ€νν κΉ? μ λ΅μ 2λ² μμ±μμ΄λ€. μ°λ¦¬λ λΆλͺ
10κ°μ 곡κ°μ 3μ΄λΌλ κ°μ λ£κ³ μΆμλ° μ 2λ² μμ±μλ₯Ό μ€νν κΉ?
κ·Έ μ΄μ λ size_typeκ³Ό ν
νλ¦Ώ μΈμμΈ InputIteratorμ μλ€. λ³Έ μμ μλ λμμμ§ μμ§λ§ λ²‘ν° μ½λλ₯Ό μ΄ν΄λ³΄λ©΄ size_typeμ λΆνΈ μλ μ μ νμ
μ΄λ€. λ°λΌμ 10μ λΆνΈκ° μλ μ μμ΄κΈ° λλ¬Έμ 1λ² μμ±μμλ λ§κΈ΄ νμ§λ§ μμ ν λ€μ΄λ§λ μμ±μλ 2λ² μμ±μμ΄λ€. λ§μ½ InputIteratorμ intκ° λ€μ΄μ¨λ€λ©΄ 2λ² μμ±μλ λ€μκ³Ό κ°μ΄ ννν μ μμ κ²μ΄λ€.
vector (int first, int last);
C++
볡μ¬
μ»΄νμΌλ¬λ μ¬λ¬ ν보ꡰ μ€ κ°μ₯ μ ν©ν ν보λ₯Ό μ°Ύμ μ½λλ₯Ό μμ±νκ³ μ»΄νμΌνλ€. λ°λΌμ μμ κ°μ΄ InputIteratorμ iterator νμ
μ΄ λ€μ΄μ€μ§ μμμ λ°μνλ μ€λ₯λ λͺ¨νΈν¨μ λ°©μ§νκΈ° μν΄ enable_ifλ₯Ό μ¬μ©νλ€.
μμ
template <typename InputIterator>
vector(InputIterator first,
enable_if<std::is_iterator<InputIterator>::value>::type last);
C++
볡μ¬
μμ κ°μ΄ enable_ifλ₯Ό μ¬μ©νλ©΄ ν
νλ¦Ώ ννλ―Έν° InputIteratorμ iterator νμ
μ΄ λ€μ΄μμ λλ§ 2λ² μμ±μκ° μ€ν λ κ²μ΄λ€.
5. VSTD
β’ _VSTDΒ is now an alias forΒ stdΒ instead ofΒ std::_LIBCPP_ABI_NAMESPACE. This is technically not a functional change, except for folks that might have been usingΒ _VSTDΒ in creative ways (which has never been officially supported).
_VSTDλ std::_LIBCPP_ABI_NAMESPACEλ₯Ό λμ ν΄μ μ¬μ©λλ 맀ν¬λ‘μ΄λ€.
λμΆ© stdμ λΉμ·ν μ μ namespaceλΌκ³ μκ°νλ©΄ λμ§ μμκΉ μΆλ€.
Β Container
Containerλ μ΄λ¦μμ μ μ μλ―μ΄ λ³Έ κ³Όμ λ λ°μ΄ν°λ₯Ό μ μ₯ν μ μλ κ°μ²΄λ₯Ό ꡬννλ κ²μ λͺ©μ μΌλ‘ νλ€.
Containerλ λ°μ΄ν°μ μ¬λ¬ νμ
μ μμ©ν μ μλ λ₯λ ₯μ μ§λλ€. μ΄λ ν
νλ¦Ώ(template)μ ν΅ν΄ ꡬνλκ³
μ μν, μ€μν, λ¬Έμν μ¬μ§μ΄ κ°μ²΄νν κΉμ§μ μ¬λ¬ λ°μ΄ν° νμ
μ ν¬μ©νλ μ μ°μ±μ κ°κ³ μλ€.
컨ν
μ΄λλ κ°μ²΄μ μ§μ μ μΌλ‘ μ κ·Όνμ¬ κ΄λ¦¬νκ±°λ μ¬μ©ν μ μλ κΈ°λ₯μ μ 곡νλλ° μ΄λ iteratorλΌλ λ°λ³΅μλ₯Ό ν΅ν΄ μ 곡λλ€.
λ€μμ ν¬κ² μΈ κ°λ‘ ꡬλΆλλ 컨ν
μ΄λμ μ’
λ₯μ΄λ€.
1. Sequence containers ( μνμ€ μ»¨ν μ΄λ, μμ°¨μ 컨ν μ΄λ )
Sequence containerλ λ°μ΄ν°μ μμ°¨μ μΌλ‘ μ κ·Όν μ μλ ꡬ쑰(container)μ΄λ€.
Template | Container | Description |
Class template | vector | λμ μ°μ λ°°μ΄ |
Class template | deque | μλ°©ν₯ ν (double-ended queue) |
Class template | list | μ΄μ€ μ°κ²° 리μ€νΈ (doubly-linked-list) |
Class template | array (C++11) | μ μ μ°μ λ°°μ΄ |
Class template | forward_list (C++11) | λ¨μΌ μ°κ²° 리μ€νΈ (singly-linked list) |
2. Associative containers ( μ°κ΄ 컨ν μ΄λ )
Associative containerλ λ°μ΄ν°μ λΉ λ₯΄κ² μ κ·Όνκ³ κ²μν μ μλ ꡬ쑰μ΄λ€.
Template | Container | Description |
Class template | map | ν€μ μν΄ μ λ ¬λ ν€-κ° μμ λͺ¨μ
μ΄ λ ν€λ κ³ μ (Unique)ν¨ |
Class template | set | ν€λ‘ μ λ ¬ λ κ³ μ ν€μ λͺ¨μ |
Class template | multimap | ν€μ μν΄ μ λ ¬ λ ν€-κ° μμ λͺ¨μ |
Class template | multiset | ν€λ‘ μ λ ¬ λ ν€μ λͺ¨μ |
3. Unordered associative containers
λ°μ΄ν°λ₯Ό λΉ λ₯΄κ² κ²μν μ μλ ν΄μ± λ ꡬ쑰
Template | Container | Description |
Class template | unordered_map (C++11) | ν€μ μν΄ hashed λ ν€-κ° μμ λͺ¨μ
μ΄ λ ν€λ κ³ μ (unique)ν¨ |
Class template | unordered_set (C++11) | ν€μ μν΄ hashed λ κ³ μ ν€μ λͺ¨μ |
Class template | unordered_multimap (C++11) | ν€μ μν΄ hashed λ ν€-κ° μμ λͺ¨μ |
Class template | unordered_multiset (C++11) | ν€μ μν΄ hashed λ ν€μ λͺ¨μ |
4. Container adaptors
κΈ°μ‘΄ 컨ν
μ΄λμ μΈν°νμ΄μ€λ₯Ό μ ννμ¬ κΈ°λ₯μ΄ λ³νλκ±°λ μ±λ₯μ΄ μ ν λ 컨ν
μ΄λλ₯Ό λ§νλ€.
νΉμ ννμ λμλ§μ μννλλ‘ κΈ°μ‘΄μ μΈν°νμ΄μ€λ₯Ό μ ννκ³ λ°λ³΅μ(iterator)λ₯Ό μ§μνμ§ μλλ€.
λ°λΌμ μ λ ¬, μμ νμκ³Ό κ°μ STL (Standard Template Library) μκ³ λ¦¬μ¦μ μ¬μ©ν μ μλ€.
Template | Container | Description |
Class template | stack | LIFO(Last In - First Out) ꡬ쑰 |
Class template | queue | FIFO(First In - First Out) ꡬ쑰 |
Class template | priority_queue | μ°μ μμ ν λ°μ΄ν° ꡬ쑰 |
Β Iterator
λ°λ³΅μ(Iterator)
λ°λ³΅μ(Iterator)λ λ°°μ΄ λλ 컨ν
μ΄λμ μμλ₯Ό κ°λ¦¬ν€λ λͺ¨λ κ°μ²΄λ‘ μ°μ°μ μ§ν©μ μ¬μ©νμ¬ ν΄λΉ λ²μμ μμλ₯Ό λ°λ³΅ν μ μλ κ°μ²΄μ΄λ€. (i.e. μ¦λΆ μ°μ°(++) λλ μμ°Έμ‘°(*))
λ°λ³΅μμ κ°μ₯ λΉμ·ν κ²μ ν¬μΈν°λΌκ³ ν μ μλ€. ν¬μΈν° λν μ¦λΆμ°μ°μ ν΅ν΄ λ°°μ΄μ λ°λ³΅νλ©° μνλ₯Ό ν μ μλ€. λν΄μ vectorμ κ°μ containerμ λ°λ‘ μ€κ³ λ λ°λ³΅μλ μ‘΄μ¬νλλ° μ΄λ ν¬μΈν°λ λ°λ³΅μμ κ°μ μν μ μννλ€.
νμ§λ§ λͺ¨λ λ°λ³΅μκ° ν¬μΈν°μ λͺ¨λ κΈ°λ₯μ μνν μ μλ κ²μ μλκ³ λ°λ³΅μκ° μ§μνλ νΉμ±κ³Ό μμ±μ λ°λΌμ 5κ°μ λ€λ₯Έ λ²μ£Όλ‘ λΆλ₯λλ€.
Type | Description |
μ
λ ₯ λ°λ³΅μ (Input iterator) | read-only
컨ν
μ΄λλ‘λΆν° κ°μ μ½λ λ° μ°μ΄λ λ°λ³΅μλ‘ κ°μ μ½μ μλ μμ§λ§ λ³κ²½ν μλ μλ€.
μ¦κ° μ°μ°μ(++)λ₯Ό μ¬μ©ν΄μ μλ°©ν₯μΌλ‘λ§ μ΄λμ΄ κ°λ₯νλ€. |
μΆλ ₯ λ°λ³΅μ (Output iterator) | write-only
κ°μ λ³κ²½νλ λ° μ¬μ©λλ λ°λ³΅μλ‘ μ
λ ₯ λ°λ³΅μμ λ°λλ‘ κ°μ λ³κ²½ν μλ μμ§λ§ μ½μ μλ μλ€. μλ°©ν₯(++)μΌλ‘λ§ μ΄λμ΄ κ°λ₯νλ€. |
μλ°©ν₯ λ°λ³΅μ (Forward iterator) | read-write
μ¦κ° μ°μ°μλ₯Ό μ¬μ©νμ¬ μλ°©ν₯μΌλ‘λ§ μ΄λμ΄ κ°λ₯νλ€. |
μλ°©ν₯ λ°λ³΅μ (Bidirectional iterator) | read-write
μ¦κ° μ°μ°μ(++) λλ κ°μ μ°μ°μ(--)λ₯Ό μ¬μ©νμ¬ μλ°©ν₯ λλ μλ°©ν₯μΌλ‘ μ΄λμ΄ κ°λ₯νλ€. |
μμ μ κ·Ό λ°λ³΅μ (Random access iterator) | read-write
μ΅μμ λ 벨μ λ°λ³΅μλ‘ κ°μ₯ λ§μ κΈ°λ₯μ μ 곡νλ€.
μλ°©ν₯ λ°λ³΅μμ κΈ°λ₯ λ° μ²¨μμ°μ°μ([])λ₯Ό ν΅ν΄ μμμ μμμ μ κ·Όν μ μλ€.
μΌλ° ν¬μΈν°μ κΈ°λ₯μ κ±°μ λ€ μ¬μ©ν μ μλ€. |
νΉμ±κ³Ό μμ±μ λ°λΌ λ²μ£Όκ° λΆλ₯ λμ΄ μλ―μ΄ μ»¨ν
μ΄λμ λ°λΌ μ¬μ©νλ iteratorμ μ’
λ₯ λν λ€λ₯΄λ€.
Container type | Iterator type |
vector | μμ μ κ·Ό λ°λ³΅μ (Random access iterator) |
map | μλ°©ν₯ λ°λ³΅μ (Bidirectional iterator) |
set | μλ°©ν₯ λ°λ³΅μ (Bidirectional iterator) |
stack | none |
ν¬μΈν°(pointer)μ λ°λ³΅μ(Iterator)μ λΉκ΅
Pointerμ Iteratorλ 곡ν΅μ μ΄ μμΌλ©΄μ λΆλͺ
ν μ°¨μ΄μ μ΄ μ‘΄μ¬νλ€. ν¬μΈν°λ λ³μκ° λ©λͺ¨λ¦¬μ μμΉν μ£Όμ μ¦ λ³μμ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό μ μ₯νλ λ³μμ΄κ³ iteratorλ λ°°μ΄μ΄λ 컨ν
μ΄λ λ΄μ λ²μ£Όμ μμλ₯Ό κ°λ¦¬ν€κ³ λ°λ³΅μ μΌλ‘ μνν μ μλ κ°μ²΄μ΄λ€. λν΄μ ν¬μΈν°λ μ¦κ°μ κ°μ κ·Έλ¦¬κ³ λ§μ
μ κ°λ¨ν μνμ μΈ μ°μ°μ μνν μ μμ§λ§ iteratorλ μμμ μΈκΈν λ°μ κ°μ΄ λ²μ£Όμ λ°λΌ μ°μ° μν μ¬λΆκ° λ€λ₯΄λ€.
κ·Έλ¦¬κ³ T* νμ
μ ν¬μΈν°λ μ΄λ€ κ°μ²΄λ T νμ
μ κ°μ²΄λ₯Ό λ€ κ°λ¦¬ν¬ μ μμ§λ§ iteratorλ μ νμ μΌλ‘ ν΄λΉ 컨ν
μ΄λ λ΄μ μμμλ§ μ κ·Όν μ μλ€.
λ§μ§λ§μΌλ‘ ν¬μΈν°λ μ¦κ° μ°μ° μ μ°μλ λ©λͺ¨λ¦¬ μ£Όμμλ§ μ κ·Όν μ μλ€. νμ§λ§ μ°μμ μΌλ‘ λ©λͺ¨λ¦¬κ° μ°κ²°λμ΄ μμ§ μκ±°λ μλ‘μ΄ κ°μ²΄λ‘ λ³΅μ¬ μ μ μμ μΌλ‘ κ°μ²΄μ μ κ·Όν μ μλ€.
Β Vector
Sequence containerλ‘ λμ μ°μ λ°°μ΄ ννμ΄λ€.
Class Prototype
// class prototype
template <class T, class Allocator = std::allocator<T> > class vector;
C++
볡μ¬
Member
public:
typedef T value_type;
typedef Allocator allocator_type;
typedef typename allocator_type::reference reference;
typedef typename allocator_type::const_reference const_reference;
typedef implementation-defined iterator;
typedef implementation-defined const_iterator;
typedef typename allocator_type::size_type size_type;
typedef typename allocator_type::difference_type difference_type;
typedef typename allocator_type::pointer pointer;
typedef typename allocator_type::const_pointer const_pointer;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
C++
볡μ¬
member type | definition | notes |
value_type | 첫 λ²μ§Έ ν
νλ¦Ώ νλΌλ―Έν° (T) | |
allocator_type | λ λ²μ§Έ ν
νλ¦Ώ νλΌλ―Έν° (Alloc) | κΈ°λ³Έ κ° :
allocator<value_type> |
reference | allocator_type::reference | κΈ°λ³Έ allocatorμΌ λ :
value_type & |
const_reference | allocator_type::const_reference | κΈ°λ³Έ allocatorμΌ λ :
const value_type& |
pointer | allocator_type::pointer | κΈ°λ³Έ allocatorμΌ λ :
value_type * |
const_pointer | allocator_type::const_pointer | κΈ°λ³Έ allocatorμΌ λ :
const value_type * |
iterator | value_typeμ μμ(random)λ‘ μ κ·Όνλ λ°λ³΅μ | const_iteratorλ‘ λ³νν μ μμ |
const_iterator | const value_typeμ μμ(random)λ‘ μ κ·Όνλ λ°λ³΅μ | |
reverse_iterator | ||
const_reverse_iterator | ||
difference_type | λΆνΈκ° μλ integral type
iterator_traits<iterator>::difference_typeκ³Ό κ°λ€. | λ³΄ν΅ ptrdiff_tμ κ°λ€ |
size_type | difference_typeμ μμ΄ μλ κ°μ λνλΌ μ μλ λΆνΈ μλ μ μ νμ | λ³΄ν΅ size_tμ κ°λ€ |
Constructor
β Default constructor ( empty container constructor)
// Description
// Elementκ° μλ λΉ λ²‘ν°λ₯Ό ꡬμ±νλ€.
explicit vector (const allocator_type& alloc = allocator_type());
C++
볡μ¬
β Fill constructor
// Description
// valμ 볡μ¬λ³ΈμΈ nκ°μ elementsλ‘ μ»¨ν
μ΄λλ₯Ό ꡬμ±νλ constructor
explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
C++
볡μ¬
β Range constructor
// Description
// Parameterλ‘ λ€μ΄μ¨ firstλΆν° lastκΉμ§μ λ²μλ§νΌμ μμλ₯Ό κ°μ§ λ²‘ν° μ»¨ν
μ΄λλ₯Ό ꡬμ±
// κΈ°μ‘΄ λ²μμ μ λ ¬κ³Ό λμΌνκ² elementμ λ°°μΉκ° μ΄λ£¨μ΄μ§λ€.
template <class InputIterator>
vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
C++
볡μ¬
β Copy constructor
// Description
// Parameter x λ΄μ μλ κ°κ°μ elementλ₯Ό κ°μ μ λ ¬ μμΌλ‘ 볡μ¬νμ¬ containerλ₯Ό ꡬμ±νλ€.
vector (const vector& x);
C++
볡μ¬
β Parameter
Parameter | Description |
alloc | Allocator objectλ‘ μ»¨ν
μ΄λλ μ΄ allocatorλ₯Ό μ μ§νκ³ μ¬μ©νλ€. |
n | μ΄κΈ° 컨ν
μ΄λ μ¬μ΄μ¦ |
val | 컨ν
μ΄λμ μ±μΈ κ°μΌλ‘ 컨ν
μ΄λμ μλ nκ°μ elementλ μ΄ κ°μ 볡μ¬λ³ΈμΌλ‘ μ΄κΈ°ν λλ€. |
first, last | input iteratorλ‘ λ²μμ μ²μκ³Ό λμ κ°λ¦¬ν¨λ€.
μ£Όμ ν΄μΌν μ μ λ²μλ μ²μλΆν° λ§μ§λ§ μ¬μ΄μ λͺ¨λ μμλ₯Ό ν¬ν¨νμ§λ§ λ§μ§λ§ μμλ ν¬ν¨νμ§ μλλ€. |
x | vector object |
il | μ΄κΈ° 리μ€νΈ μ€λΈμ νΈ(Initializer_list object)
Initializer list μ μΈμμμ μλμΌλ‘ μμ±λλ€. |
Iterator
β begin
iterator begin();
const_iterator begin() const;
C++
볡μ¬
Description
λ²‘ν° λ΄μ 첫 λ²μ§Έ elementλ₯Ό κ°λ¦¬ν€λ λ°λ³΅μλ₯Ό λ°ννλ€.
μμ νλλ§μ λ°ννλ vector::frontμλ λ€λ₯΄κ² random access iteratorλ₯Ό λ°ννλ€.
λ§μ½ containerκ° λΉμ΄μλ€λ©΄, λ°ν λ iterator κ°μ μμ°Έμ‘° λμ§ μλλ€.
κ·Έλ¦¬κ³ λ§μ½ vector κ°μ²΄κ° constν λμ΄μλ€λ©΄, ν¨μλ const_iteratorλ₯Ό λ°ννλ€.
β end
iterator end();
const_iterator end() const;
C++
볡μ¬
Description
past-the-elementλ₯Ό μ°Έμ‘°νλ λ°λ³΅μλ₯Ό λ°ννλ iterator
past-the-elementλ μ΄λ‘ μ μΌλ‘ vectorμ λ§μ§λ§ μμλ₯Ό λ³΄ν΅ λ§νλ€.
μ΄ λ°λ³΅μλ μ무 κ²λ κ°λ¦¬ν€μ§ μκΈ° λλ¬Έμ μμ°Έμ‘° λμ΄μλ μλλ€.
λ³΄ν΅ beginκ³Ό κ°μ΄ μ¬μ©λμ΄ νΉμ λ²μλ₯Ό λνλΈλ€.
λ§μ½ containerκ° λΉμ΄μλ€λ©΄ beginκ³Ό κ°μ κ°μ λ°ννλ€.
Β rbegin, rendμ μμ λ°λμ κ°λ
μ κ°μ§ iteratorμ΄λ€.
Capacity
β size
// size_type : unsigned integral type
size_type size() const;
C++
볡μ¬
vector μμ μλ μμλ€μ κ°μλ₯Ό λ°ννλ ν¨μμ΄λ€.
capacity ν¨μμλ λ€λ₯΄λ©° μ€μ λ‘ vectorμμ μ‘΄μ¬νλ elementμ κ°μλ₯Ό λ°ννλ€.
β max_size
size_type max_size() const;
C++
볡μ¬
vectorκ° κ°μ§ μ μλ μ΅λμ element κ°μλ₯Ό λ°ννλ€.
β resize
// size_type n : μλ‘μ΄ μ»¨ν
μ΄λ μ¬μ΄μ¦
// value_type val : nμ΄ νμ¬ μ»¨ν
μ΄λμ μ¬μ΄μ¦λ³΄λ€ ν° κ²½μ° λ΄μ©μ΄ μΆκ°λ vectorμ λ³΅μ¬ λλ κ°μ²΄
//μ§μ νμ§ μμ κ²½μ° κΈ°λ³Έ μμ±μκ° λμ μ¬μ©λλ€.
void resize (size_type n, value_type val = value_type());
C++
볡μ¬
containerκ° nκ°μ elementsλ₯Ό κ°μ§ μ μλλ‘ containerμ μ¬μ΄μ¦λ₯Ό μ‘°μ νλ€.
λ§μ½, νλΌλ―Έν°λ‘ μ£Όμ΄μ§ nμ΄ νμ¬ containerμ μ¬μ΄μ¦λ³΄λ€ μμ κ²½μ°, νμ¬ μ»¨ν
μ΄λμ 첫 λ²μ§ΈλΆν° nκ° λ§νΌμ elementλ‘ μ‘°μ λλ€(μ€μ΄λ λ€). κ·Έ λ€μ elementλ€μ μμ λκ³ νκ΄΄λλ€(removing and destroying them).
β capacity
size_type capacity() const;
C++
볡μ¬
벑ν°μ νμ¬ ν λΉ λ μ μ₯ 곡κ°μ ν¬κΈ°λ₯Ό μμ λ¨μλ‘ λ°ννλ€.
β empty
bool empty() const;
C++
볡μ¬
벑ν°κ° νμ¬ λΉμ΄μλ μνμΈμ§(sizeκ° 0μΈμ§)μ μ¬λΆλ₯Ό λ°ννλ€.
β reserve
void reserve(size_type n);
C++
볡μ¬
vector capacityκ° μ μ΄λ nκ°μ elementλ₯Ό μμ©ν μ μλλ‘ μμ²νλ€.
λ§μ½, nμ΄ νμ¬ λ²‘ν°μ ν¬κΈ°λ³΄λ€ ν΄ κ²½μ° μ΄ ν¨μλ containerμ storageλ₯Ό n λλ κ·Έ μ΄μμΌλ‘ reallocate μν¨λ€.
Element access
β operator[]
reference operator[] (size_type n);
const_reference operator[] (size_type n) const;
C++
볡μ¬
λ²‘ν° λ΄μ nλ²μ§Έ μμΉμ μλ elementμ referenceλ₯Ό λ°ν
vector::at ν¨μμ μ μ¬νλ©° vector::at ν¨μλ bound-checked νκ³ λ§μ½ λ²μλ₯Ό λ²μ΄λλ€λ©΄ out_of_range μμΈλ₯Ό λμ§λ μ λ§ μ μΈνλ©΄ λμΌν κΈ°λ₯μ μ§λλ€.
β at
reference at (size_type n);
const_reference at (size_type n) const;
C++
볡μ¬
λ²‘ν° λ΄μ nλ²μ§Έ μμΉμ μλ elementμ referenceλ₯Ό λ°ν
μ΄ ν¨μλ operator[]κ³Ό λ€λ₯΄κ² μλμ μΌλ‘ nμ΄ vectorμ μ ν©ν λ²μ λ΄μ μλμ§ νμΈνλ€. λ§μ½ nμ΄ sizeμ κ°κ±°λ λ ν° κ²κ³Ό κ°μ΄ μ ν©ν κ°μ΄ μλλΌλ©΄ out_of_range exceptionμ λμ§λ€.
β front
reference front(); // normal one
const_reference front() const; // if vector qualified as const
C++
볡μ¬
vector λ΄μ μλ 첫 λ²μ§Έ μμμ referenceλ₯Ό λ°ννλ€.
vector::begin λ©€λ²μλ λ€λ₯Έ μ μ΄ μλλ°, vector::begin ν¨μλ iteratorλ₯Ό λ°ννκ³ μ΄ ν¨μλ μ§μ μ μΈ referenceλ₯Ό λ°ννλ€. λΉμ΄μλ vectorμμμ μ΄ ν¨μ νΈμΆμ undefined behaviorμ μ λ°νλ€.
β back
reference back();
const_reference back() const;
C++
볡μ¬
vector λ΄μ μλ λ§μ§λ§ μμμ referenceλ₯Ό λ°ν
Modifiers
β assign
// (1) range function
template <class InputIterator>
void assign (InputIterator first, InputIterator last);
// (2) fill function
void assign (size_type n, const value_type& val);
C++
볡μ¬
vectorμ μλ κΈ°μ‘΄μ contentsλ₯Ό μλ‘μ΄ contentsλ‘ ν λΉνκ³ μ΄μ λ°λΌ sizeλ₯Ό μμ νλ ν¨μ
(1) range functionμ κ²½μ° μλ‘μ΄ λ΄μ©μ firstλΆν° lastκΉμ§ λ²μμ κ° μμλ‘, λμΌν μμλ‘ κ΅¬μ± λμ΄ μλ€.
(2) fill functionμ κ²½μ° μλ‘μ΄ λ΄μ©μ nκ°λ‘, valμμ 볡μ¬λ μμλ‘ μ΄κΈ°ν λλ€. κΈ°μ‘΄μ μμλ μ΄ assign ν¨μμ νΈμΆ μ μ λͺ¨λ νκ΄΄λκ³ , μλ‘μ΄ μμλ‘ λ체λλ€. λΉμ°νμ§λ§ μλ‘μ΄ μμλ€μ λ²μ λλ 벑ν°μ ν¬κΈ°κ° νμ¬ λ²‘ν° μ»¨ν
μ΄λμ μ©λμ μ΄κ³Όνλ κ²½μ° μ μ₯ 곡κ°μ΄ μ¬ ν λΉλλ€.
β push_back
void push_back (const value_type &val);
C++
볡μ¬
μλ‘μ΄ elementλ₯Ό vectorμ λ§μ§λ§μ μΆκ°νλ€. μ΄ ν¨μλ ν¨κ³Όμ μΌλ‘ containerμ sizeλ₯Ό νλ μ¦κ°μν€κ³ κΈ°μ‘΄ vectorμ capacityμ ν¬κΈ°λ₯Ό λμ΄μ€ κ²½μ° μλμΌλ‘ reallocationμ μΌμΌν¨λ€.
β pop_back
void pop_back();
C++
볡μ¬
λ²‘ν° μμ μλ λ§μ§λ§ μμλ₯Ό μ κ±°νκ³ νκ΄΄νλ€. μ΄ κ²½μ° containerμ sizeκ° νλ κ°μνλ€.
containerκ° λΉμ΄μλ κ²½μ° undefined behaviorμ΄λ€.
β insert
// (1) single element
iterator insert (iterator position, const value_type& val);
// (2) fill
void insert (iterator position, size_type n, const value_type& val);
// (3) range
template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last);
C++
볡μ¬
벑ν°λ μ΄ insert ν¨μμ μν΄ μ§μ λ μμΉμ μμκ° μΆκ°λκ³ , μΆκ°λ μμμ κ°μ λ§νΌ sizeκ° μ¦κ°νλ€. λ§μ°¬κ°μ§λ‘ capacityμ λ°λΌ reallocationμ΄ μλμΌλ‘ μ§νλλ€. 벑ν°λ λ°°μ΄(array)λ₯Ό κΈ°λ³Έ μ μ₯μλ‘ μ¬μ©νκΈ° λλ¬Έμ μ½μ
μ΄ μ΄λ£¨μ΄μ§λ κ²½μ° κΈ°μ‘΄μ elementμ μ¬λ°°μΉκ° μ΄λ£¨μ΄μ§λ€.
β erase
iterator erase (iterator position);
iterator erase (iterator first, iterator last);
C++
볡μ¬
vectorμμ λ¨μΌ elementλ₯Ό μ κ±°νκ±°λ firstμ lastλ‘ μ΄λ£¨μ΄μ§ λ²μλ§νΌμ μμλ₯Ό μ κ±°νλ€.
β swap
void swap (vector& x);
C++
볡μ¬
λ°μμ¨ νλΌλ―Έν°μ μ λ΄μ©μΌλ‘ containerμ λ΄μ©μ κ΅ννλ€. ν¬κΈ°λ λ€λ₯Ό μ μμ§λ§ μ νμ λμΌνλ€.
ν¨μ νΈμΆ νμ κΈ°μ‘΄μ vector λ΄μ©μ μ μλ λ΄μ©μ΄κ³ μ λ΄μ©μ κΈ°μ‘΄μ vectorμ λ΄μ©κ³Ό κ°λ€.
β clear
void clear();
C++
볡μ¬
vectorμ λͺ¨λ elementλ€μ μ κ±°νλ€. κ·Έ λ€ containerμ sizeλ 0μ΄λ€. μ΄ ν¨μλ μ¬ν λΉμ 보μ₯νμ§ μμΌλ©° ν¨μμ νΈμΆλ‘ λ²‘ν° capacityμ λ³κ²½ λν 보μ₯νμ§ μλλ€. reallocationμ μ¬μ©ν λ체μ¬λ swap ν¨μλ₯Ό μ¬μ©νλ κ²μ΄λ€.
Allocator
β get_allocator
allocator_type get_allocator() const;
C++
볡μ¬
vectorμ μ°κ΄λ allocator κ°μ²΄μ 볡μ¬λ³Έμ λ°ννλ€.
Β Stack
Container adaptorλ‘ LIFO λ°μ΄ν° ꡬ쑰μ΄λ€. Stackμ κΈ°μ‘΄ 컨ν
μ΄λμ μΈν°νμ΄μ€λ₯Ό μ ννμ¬ μ±λ₯μ΄ μ ν λ 컨ν
μ΄λμ΄λ€. λ΄μ₯ λ LLVMμ CPP STLμ Stackμ dequeλ‘ κ΅¬ννμλ€. νμ§λ§ μμμ vectorλ₯Ό μ΄λ―Έ ꡬν νκΈ° λλ¬Έμ vectorλ‘ stackμ ꡬννμλ€.
Class prototype
template <class _Tp, class _Container /*= deque<_Tp>*/>
class stack;
C++
볡μ¬
Member types
public:
typedef Container container_type;
typedef typename container_type::value_type value_type;
typedef typename container_type::reference reference;
typedef typename container_type::const_reference const_reference;
typedef typename container_type::size_type size_type;
protected:
container_type c;
C++
볡μ¬
Member | Description |
Container container_type | The second template parameter (Container)
μ΄ μ€νμ κΈ°λ°μ΄ λλ underlying container |
container_type::value_type value_type | The first template parameter (T)
Stackμ elements type |
container_type::reference reference | Underlying containerμ reference |
container_type::const_reference const_reference | Underlying containerμ const_reference |
container_type::size_type size_type | An unsigned integral type
λ³΄ν΅ size_tμ κ°μ |
Member functions
β empty
bool empty() const;
C++
볡μ¬
Stackμ΄ λΉμ΄μλμ§μ μ¬λΆλ₯Ό λ°ννλ€. λ§μ½ κΈ°λ° μ»¨ν
μ΄λμ μ¬μ΄μ¦κ° 0μ΄λ©΄ true, μλλ©΄ falseλ₯Ό λ°ννλ€.
β size
size_type size() const;
C++
볡μ¬
κΈ°λ° μ»¨ν
μ΄λμ element κ°μλ₯Ό λ°ννλ€.
β top
value_type& top();
const value_type& top() const;
C++
볡μ¬
Stackμ μ μΌ μ μμμ λ νΌλ°μ€λ₯Ό λ°ννλ€.
β push
void push (const value_type& val);
C++
볡μ¬
Stackμ μ μΌ μμ μλ‘μ΄ elementλ₯Ό μΆκ°νλ€.
β pop
void pop();
C++
볡μ¬
Stackμ μ μΌ μ μμλ₯Ό μ κ±°νλ€.
Β map
STLμ mapμ red-black treeλ‘ κ΅¬νλμ΄ μλ€.
Β Red-black tree
red-black treeλ μ΄λ¦ κ·Έλλ‘ λ
ΈνΈμ μμ΄ Redκ±°λ BlackμΈ νΈλ¦¬ ꡬ쑰λ₯Ό λ§νλ€. μΌλ° μ΄μ§νΈλ¦¬μ λΉμ·ν μ±κ²©μ κ°μ§λ§ ν μͺ½μΌλ‘ μΉμ°μ³μ μκΈ°λ μ΄μ§νΈλ¦¬μ λ¨μ μ 보μνκΈ° μν΄ κ· ν(Balanced) μ΄μ§ νμ νΈλ¦¬ ννλ‘ μ€κ³λ ꡬ쑰μ΄λ€.
Red-black treeμ μ±μ§μ μλμ κ°λ€.
1. Root λ
Έλμ μμ Blackμ΄λ€.
2. λͺ¨λ 리ν λ
Έλλ Blackμ΄λ€.
3. κ° λ
Έλμ μμ Red λλ Blackμ΄λ€.
4. Red λ
Έλμ μμ μμ λ°λμ Blackμ΄λ€. ( Red - Redλ‘ μ΄μ΄μ§λ μ°κ²°μ μ λ¨. B - Bλ κ°λ₯)
5. κ° λ
Έλμμ 리ν λ
Έλμ λ€λ€λ₯Ό λκΉμ§ Black λ
Έλ κ°μλ λͺ¨λ κ°λ€.
[κ·Έλ¦Ό] Red-black νΈλ¦¬μ μμ
μ κ·Έλ¦Όμμ μ μ μλ―μ΄ Red-black treeλ κ· ν μ΄μ§ νμ νΈλ¦¬μ ννμ΄λ€. μ΄λ λ
Έλλ₯Ό κΈ°μ€μΌλ‘ μΌμͺ½μλ μμ μ κ°λ³΄λ€ μμ κ°μ κ°μ§ λ
Έλκ° μ€λ₯Έμͺ½μλ μμ μ κ°λ³΄λ€ ν° κ°μ κ°μ§ λ
Έλκ° μ΄μ΄μ Έ μλ€.
μΆκ°μ μΌλ‘ 리ν λ
Έλμ μμ΄ Blackμ΄λΌκ³ μμ μΈκΈνμλλ° κ·Έλ¦Όμ 보면 리ν λ
Έλκ° 125, 175, 225, 275 κ°μ μ§λ λ
ΈλλΌκ³ μκ°ν μ μλ€. μ΄ λ
Έλμ μμ RedλΌ μ³μ§ μμ RB TreeλΌκ³ μκ°ν μ μμ§λ§ μλ¬΄λ° κ°μ κ°μ§ μμ NULL(NIL) LEAFλ 리ν λ
Έλλ‘ κ°μ£Όνλ€. κ·Έλ¦¬κ³ μ΄ NULL LEAF NODEμ μμ Blackμ΄λ€.
Red-black treeμ νΉμ§μ μ½μκ³Ό κ°λ€. λ
Έλμ μ½μ
κ³Ό μμ μ°μ°μ μν ν λ€μλ μμ λ€μ―κ°μ§ νΉμ§μ΄ μ μ§λμ΄μΌ νλ€λ λ»μ΄λ€. μλλ μ½μ
κ³Ό μμ μ°μ°μ μν νμ λ μ΄λ»κ² λ
Έλλ€μ μμΉλ₯Ό μ‘°μ νκ³ μ ν¨μ±μ λ§μ‘±μν€λμ§μ λν΄μ μκ°νλ€.
Β Red-black tree insertion - μ½μ μ°μ°
κΈ°λ³Έμ μΌλ‘ 루νΈλ₯Ό μ μΈν μ½μ
λλ λ
Έλμ μμ Redμ΄λ€. νΈλ¦¬κ° λΉμ΄μμ λ μ²μμΌλ‘ μ½μ
λλ λ
Έλλ λ£¨νΈ λ
Έλμ΄λ―λ‘ Blackμ΄λ€. μ½μ
μ°μ° μ νΈλ¦¬μ μ ν¨μ±μ νκ΄΄νλ 쑰건μ λ§€μ° κ°λ¨νλ€. λ°λ‘ μ½μ
λλ λ
Έλμ λΆλͺ¨ λ
Έλμ μμ΄ λͺ¨λ Red μΌ λμ΄λ€. λΆλͺ¨ λ
Έλμ μ½μ
λ μμ λ
Έλμ μμ΄ λͺ¨λ Redμ΄λ©΄ λνμ μΌλ‘ 4λ² νΉμ§(μ±μ§)μ μλ°°νλ€.
4. Red λ
Έλμ μμ μμ λ°λμ Blackμ΄λ€. ( Red - Redλ‘ μ΄μ΄μ§λ μ°κ²°μ μ λ¨. B - Bλ κ°λ₯)
μ½μ
μ΄νμ νΈλ¦¬μ μ ν¨μ±μ΄ νκ΄΄ λμλ€λ©΄ μ μ νκ² νΈλ¦¬μ ꡬ쑰λ₯Ό μ‘°μ ν΄μΌνλ€. μ΄ μ‘°μ κ³Όμ μ ν¬κ² λ κ°μ§λ‘ λλλ€.
1. Recoloring ( μμ λ³κ²½ )
2. Rotation ( νμ )
1. Recoloring
λ
Έλμ μμ λ³κ²½νλ κ³Όμ μ λ§νλ€. μ΄ μμμ λ³κ²½νλ κ³Όμ μ λΆλͺ¨μ μλ‘ λ€μ΄μ¨ λ
Έλμ μμ΄ λͺ¨λ Redμ΄κ³ λΆλͺ¨μ νμ μ¦ Sibling nodeμ μμ΄ RedμΌ λ μ΄λ£¨μ΄μ§λ€.
νΈλ¦¬κ° μμ κ°μ΄ κ΅¬μ± λμ΄μλ€κ³ ν λ 150μ μ½μ
νκ³ μ νλ€.
μ΄λ κ² λλ©΄ 150κ³Ό 175 λ
Έλ λͺ¨λ Redμ΄λ―λ‘ λ
Έλλ₯Ό νμ νκ±°λ μμ λ€μ μΉ ν΄ μ€ νμκ° μλ€. Recoloringμ νλ κ²½μ°λ Siblingμ μμ΄ RedμΌ κ²½μ°μ μννλ€.
μ΄ν΄λ₯Ό λκΈ° μν΄ Sibling λ
ΈλμΈ 225λ₯Ό μΆκ°νλ€. κ³μν΄μ Sibling (μ΄ν s) λ
Έλκ° Redμ΄κ³ Parent(μ΄ν p) λ
Έλκ° RedλΌλ©΄ pμ s λ
Έλμ μμ BlackμΌλ‘, Parentμ Parent λ
Έλμ μμ Redλ‘ λ³κ²½νλ©΄ λλ€.
μλ²½ν΄ λ³΄μ΄μ§λ§ μ¬κΈ°μ μκΈΈ μ μλ λ¬Έμ μ μ΄ ν κ°μ§ λ μλ€.
ppκ° λ£¨νΈ λ
ΈλλΌλ©΄ ppμ μμ κ°μ λ‘ BlackμΌλ‘ λ³κ²½μμΌ νΈλ¦¬μ μ ν¨μ±μ μμ νκ² ν μ μλ€. νμ§λ§ ppκ° λ£¨νΈ λ
Έλκ° μλλΌ μμ νΈλ¦¬μ λ
Έλ μ€ νλμΌ κ²½μ°λΌλ©΄ λ¬Έμ κ° λ°μν μ μλ€.
300μ μ°μΈ‘ λ
Έλ νΈλ¦¬λ μλ΅νλ€. μ΄λ΄ κ²½μ° ppμ λ
Έλλ Red, 300μ λ
Έλλ Redμ΄κΈ° λλ¬Έμ λ€μ μ‘°μ μ΄ νμνλ€. λ§μ°¬κ°μ§λ‘ 200 κ°μ΄ λ΄κΈ΄ pp λ
Έλλ₯Ό κΈ°μ€μΌλ‘ λΆλͺ¨ κ·Έλ¦¬κ³ siblingμ νμΈνλ©° μ¬κ·μ μΌλ‘ μ‘°μ μ μννλ©΄ ν΄κ²°λλ€.
2. Rotation
λ
Έλλ€μ νμ νλ κ³Όμ μ λ§νλ€. λ
Έλλ€μ νμ νλ κ²½μ°λ Sibling λ
Έλμ μμ΄ Blackμ΄κ±°λ μλ κ²½μ°(NIL)μ μννλ€.
Rotationμ 첫 λ²μ§Έ κ²½μ°λ μλ‘μ΄ λ
Έλ xκ° λΆλͺ¨μ μΌμͺ½μ μ½μ
λλ κ²½μ°μ΄λ€.
μλ‘ μΆκ° λ λ
Έλ xλ₯Ό κΈ°μ€μΌλ‘ pλ
Έλμ νμ μΈ sλ
Έλμ μμ΄ BlackμΈ κ²μ μ μ μλ€. Recoloringμ μν ν λ sμ μμ΄ RedμΈ κ²½μ°λ λ€λ₯΄λ€.
μ΄μ κ°μ κ²½μ° pλ₯Ό κΈ°μ€μΌλ‘ right rotateνκ³ pμ μμ ppλ‘, pμ μμ BlackμΌλ‘ λ³κ²½ ν΄μ£Όλ©΄ λλ€.
Rotationμ λ λ²μ§Έ κ²½μ°λ μλ‘ μΆκ°λλ λ
Έλμ μμΉκ° pλ
Έλμ μ€λ₯Έμͺ½μ μ½μ
λ λμ΄λ€.
μ΄ κ²½μ°λ Rotationμ 첫 λ²μ§Έ κ²½μ°λ‘ λ§λ€μ΄ μ£Όλ μ°μ°μ μννλ€. κ·Έλ κ² λκΈ° μν΄μλ pλ₯Ό κΈ°μ€μΌλ‘ left rotate μμ
μ μννλ©΄ λλ€.
κ²°κ³Όμ μΌλ‘ pλ₯Ό κΈ°μ€μΌλ‘ sμ μμ΄ BlackμΈ μ²« λ²μ§Έ κ²½μ°μ ννκ° λ§λ€μ΄μ‘λ€. λ€μ pμ λΆλͺ¨μΈ xλ₯Ό κΈ°μ€μΌλ‘ right rotateλ₯Ό μννλ€.
Β Red-black tree insertion - μμ μ°μ°
νΈλ¦¬μ κ°μ μΆκ°νλ μ½μ
μ°μ° μΈμλ κ°μ μμ νλ μ°μ°λ μ‘΄μ¬νλ€. μμ μ°μ°μμλ 4λ² νλͺ© λΏλ§ μλλΌ 5λ² νλͺ©μ μλ°λ νΉν κ³ λ €λ₯Ό ν΄λ³΄μμΌ νλ€.
4. Red λ
Έλμ μμ μμ λ°λμ Blackμ΄λ€. ( Red - Redλ‘ μ΄μ΄μ§λ μ°κ²°μ μ λ¨. B - Bλ κ°λ₯)
5. κ° λ
Έλμμ 리ν λ
Έλμ λ€λ€λ₯Ό λκΉμ§ Black λ
Έλ κ°μλ λͺ¨λ κ°λ€.
μμ΄ RedμΈ λ
Έλλ₯Ό μμ νλ κ²μ ν° λ¬Έμ κ° λ°μνμ§ μλλ€. νμ§λ§ μμ΄ BlackμΈ λ
Έλμ Black μμλ
Έλλ₯Ό μμ νκ² λλ©΄ νΈλ¦¬μμ Black λ
Έλκ° νλ μ¬λΌμ§λ κ²μ΄κΈ° λλ¬Έμ 5λ² νΉμ§μ΄ μλ°°λμ΄ λ°Έλ°μ€μ ν° λ¬Έμ μ μ μκ²¨μ€ μ μλ€. λ€μ λ§νλ©΄ λΆλͺ¨μ μμ λͺ¨λ BlackμΌ λ Black μμ λ
Έλλ₯Ό μμ νλ©΄ λ¬Έμ κ° λ°μνλ€.
μμ κ°μ΄ μμ νλ €κ³ νλ λ
Έλλ₯Ό m, κ·Έ μμμ xλΌκ³ νμ λ mμ μμ νλ κ²μ λ¬Έμ κ° μλ€. ppμ μμ μ΄λ μμ΄ μλ ν° μκ΄μ΄ μλ€. μλνλ©΄ μμ μ°μ°μ μ§ν ν λ€ rotationμ΄λ coloring μμ
μ μννλ©΄ λκΈ° λλ¬Έμ΄λ€.
μμ κ°μ κ²½μ° μμ νκ³ μ νλ λ
Έλμ μμ Blackμ΄κ³ μμμ λ
Έλλ Redμ΄λ€. μ΄ κ²½μ° λ체 λ xμ μμ BlackμΌλ‘ λ³νμν¨λ€. λΉμ°ν μμ μμλ λ¨μΌ νΈλ¦¬κ° μλ μλ μλμ μΆκ°μ μΈ νΈλ¦¬κ° μ‘΄μ¬ν μ μλ€.
λ¬Έμ κ° μκΈ°λ κ²½μ°λ mκ³Ό x λͺ¨λ BlackμΈ κ²½μ°μ΄λ€.
λ€μμ mκ³Ό xκ° λͺ¨λ BlackμΌ λ μ§μ΄ μ§νμ μ‘°μ κ³Όμ μ μκ°νλ€.
λ¨Όμ mμ Parent, μμ κ·Έλ¦Όμμλ ppκ° RedμΌ λμ κ²½μ°μ΄λ€. μμλ₯Ό μ‘°κΈ μμ νλ©΄ λ€μκ³Ό κ°λ€.
λ¨Όμ ppκ° pλ‘ λ³νκ³ , pκ° RedμΌ λμ κ²½μ°μ΄λ€.
1.
pκ° Redμ΄κ³ Lκ³Ό Rμ΄ Black, BlackμΌ λ ( Sλ λΉμ°ν BlackμΌ μ λ°μ μλ€ )
β λ¨μν pμ sμ μμ λ³κ²½νλ€.
2.
pκ° Redμ΄κ³ Lκ³Ό Rμ΄ *, RedμΌ λ ( Sλ λΉμ°ν BlackμΌ μ λ°μ μλ€ )
μ¬κΈ°μ * μ λ
Έλμ μμ΄ White μΈ κ²μ μ΄λ μμ΄λ μ§ μ¬ μ μλ€λ μλ―Έμ΄λ€.
pλ₯Ό κΈ°μ€μΌλ‘ left-rotate β pμ sμ μμ λ³κ²½ β Rμ μμ BlackμΌλ‘ λ³κ²½
3.
pκ° Redμ΄κ³ Lκ³Ό Rμ΄ Red, BlackμΌ λ ( Sλ λΉμ°ν BlackμΌ μ λ°μ μλ€ )
μ¬κΈ°μ * μ λ
Έλμ μμ΄ White μΈ κ²μ μ΄λ μμ΄λ μ§ μ¬ μ μλ€λ μλ―Έμ΄λ€.
sλ₯Ό κΈ°μ€μΌλ‘ right-rotate β Lκ³Ό sμ μμ λ³κ²½ β Case 2λ‘ μ΄λ
pλ₯Ό κΈ°μ€μΌλ‘ left-rotate β pμ Lμ μμ λ³κ²½ β sμ μμ BlackμΌλ‘ λ³κ²½
1.
pκ° Blackμ΄κ³ Sμ Lκ³Ό Rμ΄ Black, Black, BlackμΌ λ
λͺ¨λ λ
Έλκ° BlackμΌ κ²½μ°, xμ siblingμ μμ Redλ‘ λ³κ²½νλ€. κ·Έλ¬λ©΄ xμμ λ°μ λμλ Blackλ
Έλμ λΆμ‘± λ¬Έμ κ° pλ‘ μ μΉλλλ°, μ΄ κ²½μ° pλ₯Ό κΈ°μ€ λ
Έλλ‘ νμ¬ μ¬κ·μ μΌλ‘ λ¬Έμ λ₯Ό ν΄κ²°νλ€.
2.
pκ° Blackμ΄κ³ Sμ Lκ³Ό Rμ΄ Black, *, RedμΌ λ
pλ₯Ό κΈ°μ€μΌλ‘ left-rotate β pμ sμ μμ λ°κΏ β Rμ μμ BlackμΌλ‘ λ³κ²½
3.
pκ° Blackμ΄κ³ Sμ Lκ³Ό Rμ΄ Black, Red, BlackμΌ λ
sλ₯Ό κΈ°μ€μΌλ‘ right-rotate β Lκ³Ό sμ μμ λ°κΏ
2λ² μΌμ΄μ€λ‘ μ΄λνμ¬ μ§ν μ‘°μ
pλ₯Ό κΈ°μ€μΌλ‘ left-rotate β pμ Lμ μμ λ°κΏ β sμ μμ BlackμΌλ‘ λ³κ²½
4.
pκ° Blackμ΄κ³ Sμ Lκ³Ό Rμ΄ Red, Black, BlackμΌ λ
pλ₯Ό κΈ°μ€μΌλ‘ left-rotate β pμ sμ μμ λ°κΏ.
μ¬κΈ°κΉμ§ μ‘°μ μ λ§μ³€μ λ μμ§ xλ₯Ό κ΄ν΅νλ κ²½λ‘μ Black λ
Έλλ λΆμ‘±νλ€. λ°λΌμ xλ₯Ό κΈ°μ€μΌλ‘ μ‘°μ μ κ³μν΄μΌνλ€. xμ p κ·Έλ¦¬κ³ Lμ 보면 pκ° RedμΌ λμ κ²½μ°κ° λ μ€λ₯Έλ€. λ°λΌμ μλ¨μ 1, 2, 3 μ€ νλλ₯Ό μ ννμ¬ ν΄κ²°νλ©΄ λλ€.
μ½μ
κ³Ό μμ μ°μ° λͺ¨λ λ¬Έμ κ° λ°μνλ μ§μ μ κΈ°μ€μΌλ‘ Recoloring, Rotation λ±μ μ°μ°μ μννλ€. μμ μ°μ°μμλ μ‘°μ νμ Black λ
Έλκ° λΆμ‘±ν λΆλΆμ΄ μ μ΄ λ μ μκ³ μ΄μ κ°μ νμμ΄ λ°μ λ μ λΆμ‘±ν λΆλΆμ κΈ°μ€μΌλ‘ μ¬κ·μ μΌλ‘ λ¬Έμ λ₯Ό ν΄κ²°ν΄λκ°λ©΄ λλ€.
μ΄μ μ§μ§ mapμ μμμ΄λ€.
mapμ Associative containerλ‘ ν€μ κ° (Key and Value)λ‘ μ΄λ£¨μ΄μ Έ μλ ꡬ쑰μ΄λ€. μ΄ λ ν€(Key) κ°μ κ³ μ νλ©° μ€λ³΅μ νμ©νμ§ μλλ€. λν΄μ STLμ mapμ Red-black treeλ‘ κ΅¬νλμ΄ μκΈ° λλ¬Έμ μλμΌλ‘ μ λ ¬λμ΄ μκ³ λΉ λ₯Έ κ²μ, μ½μ
, μμ μκ°μ 보μ₯λ°λλ€.
Prototype
template < class Key, // map::key_type
class T, // map::mapped_type
class Compare = less<Key>, // map::key_compare
class Alloc = allocator<pair<const Key,T> > // map::allocator_type
> class map;
C++
볡μ¬
Member types
public:
// types:
typedef Key key_type;
typedef T mapped_type;
typedef pair<const key_type, mapped_type> value_type;
typedef Compare key_compare;
typedef Allocator allocator_type;
typedef typename allocator_type::reference reference;
typedef typename allocator_type::const_reference const_reference;
typedef typename allocator_type::pointer pointer;
typedef typename allocator_type::const_pointer const_pointer;
typedef typename allocator_type::size_type size_type;
typedef typename allocator_type::difference_type difference_type;
typedef implementation-defined iterator;
typedef implementation-defined const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
C++
볡μ¬
Constructor
β Empty constructor with no element
explicit map (const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());
C++
볡μ¬
β Range constructor
template <class InputIterator>
map (InputIterator first, InputIterator last,
const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());
C++
볡μ¬
β Copy constructor
map (const map& x);
C++
볡μ¬
Parameter
Parameter | Description |
comp | λΉκ΅ μ°μ° κ°μ²΄. λ κ°μ ν€λ₯Ό λΉκ΅νμ¬ μ²« λ²μ§Έ μΈμκ° λ λ²μ§Έ μΈμλ³΄λ€ μκ³ μμ μμΉνλ€λ©΄ trueλ₯Ό, μλλ©΄ falseλ₯Ό λ°ννλ€.
key_compare()λ container λ΄μμ μ¬μ©λλ λΉκ΅ μ°μ° κ°μ²΄λ‘ template parameter μ€ Compμ λ³μΉμΌλ‘ μ¬μ©λλ€. |
alloc | Allocator objectλ‘ μ»¨ν
μ΄λλ μ΄ allocatorλ₯Ό μ μ§νκ³ μ¬μ©νλ€. |
first, last | input iteratorλ‘ λ²μμ μ²μκ³Ό λμ κ°λ¦¬ν¨λ€.
μ£Όμ ν΄μΌν μ μ λ²μλ μ²μλΆν° λ§μ§λ§ μ¬μ΄μ λͺ¨λ μμλ₯Ό ν¬ν¨νμ§λ§ λ§μ§λ§ μμλ ν¬ν¨νμ§ μλλ€. |
x | λμΌν μ νμ λ€λ₯Έ 맡 κ°μ²΄(λμΌν ν΄λμ€ ν
νλ¦Ώ μΈμ Key, T, Compare λ° Allocate)λ‘, μ΄ xμ λ΄μ©μ΄ 볡μ¬λκ±°λ νλλλ€. |
il | μ΄κΈ° 리μ€νΈ μ€λΈμ νΈ |
Iterators
β begin
iterator begin();
const_iterator begin() const;
C++
볡μ¬
map containerμ 첫 λ²μ§Έ μμλ₯Ό μ°Έμ‘°νλ λ°λ³΅μλ₯Ό λ°ννλ€. μ€μν κ²μ mapμ νμ μ λ ¬μ΄ λμ΄ μκ³ μ½μ
μ΄λ μμ μ°μ° μ 첫 λ²μ§Έ μμκ° λ°λ μ μλ€λ κ²μ΄λ€.
β end
iterator end();
const_iterator end() const;
C++
볡μ¬
map containerμ λ§μ§λ§ μμλ₯Ό μ°Έμ‘°νλ λ°λ³΅μλ₯Ό λ°ννλ€.
β rbegin
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
C++
볡μ¬
컨ν
μ΄λμ λ§μ§λ§ μμλ₯Ό κ°λ¦¬ν€λ μλ°©ν₯ Iteratorλ₯Ό λ°ννλ€.
β rend
reverse_iterator rend();
const_reverse_iterator rend() const;
C++
볡μ¬
컨ν
μ΄λμ 첫 λ²μ§Έ μμλ₯Ό κ°λ¦¬ν€λ μλ°©ν₯ Iteratorλ₯Ό λ°ννλ€.
Capacity
β empty
bool empty() const;
C++
볡μ¬
컨ν
μ΄λκ° λΉμ΄μλμ§ μλμ§μ μ¬λΆλ₯Ό λ°ννλ€.
β size
size_type size() const;
C++
볡μ¬
map container λ΄μ μλ μμμ κ°μλ₯Ό λ°ννλ€.
β max_size
size_type max_size() const;
C++
볡μ¬
map containerκ° κ°κ³ μμ μ μλ μμμ μ΅λ κ°μλ₯Ό λ°ννλ€.
Element access
β operator[]
mapped_type& operator[] (const key_type& k);
C++
볡μ¬
kκ° μ»¨ν
μ΄λμ μλ μμμ ν€μ μΌμΉνλ©΄ ν¨μλ 맀νλ κ°μ λν μ°Έμ‘°λ₯Ό λ°ννλ€.
kκ° μ»¨ν
μ΄λμ μλ μμμ ν€μ μΌμΉνμ§ μμΌλ©΄ ν¨μλ ν΄λΉ ν€λ‘ μ μμλ₯Ό μ½μ
νκ³ λ§€νλ κ°μ λν μ°Έμ‘°λ₯Ό λ°νν©λλ€. μ΄ κ²½μ° mapμ λ°λ‘ κ°μ μΆκ°νμ§ μμλ μμ±μλ₯Ό ν΅ν΄ mapμ κ°μ²΄κ° ν λΉλλ€.
β at
mapped_type& at (const key_type& k);
const mapped_type& at (const key_type& k) const;
C++
볡μ¬
kλ‘ λ§€νλ κ°μ λν μ°Έμ‘°λ₯Ό λ°ννλ€. λ§μ½ μλ¬΄λ° κ°λ 맀ν λμ§ μλλ€λ©΄ out_of_range μ€λ₯λ₯Ό throwνλ€.
Modifiers
β insert
//single element
pair<iterator,bool> insert (const value_type& val);
//with hint
iterator insert (iterator position, const value_type& val);
//range
template <class InputIterator>
void insert (InputIterator first, InputIterator last);
C++
볡μ¬
Β νλΌλ―Έν° positionμ valμ΄ μ½μ
λ μμΉμ λν ννΈλ‘, valμ ν€ κ°λ³΄λ€ μμ μμλ₯Ό κ°λ¦¬ν€κ² λλ©΄ μ½μ
μκ°μ μ΅μ ν ν μ μλ€.
Β pair<iterator, bool>μ pair::firstλ μλ‘ μ½μ
λ μμ λλ λμΌν ν€λ₯Ό κ°κ³ μλ μμλ₯Ό κ°λ¦¬ν€λ iteratorλ‘ μ€μ λλ€. pair::secondλ λ§μ½ λμΌν ν€λ₯Ό κ°μ§ μμκ° map λ΄μ μλ€λ©΄ falseλ₯Ό, μ μμ μΌλ‘ μ μ½μ
νμλ€λ©΄ trueλ₯Ό λ°ννλ€.
β erase
void erase (iterator position);
size_type erase (const key_type& k);
void erase (iterator first, iterator last);
C++
볡μ¬
λ²μ νΉμ νΉμ μμΉμ μμλ₯Ό μμ νλ€.
β swap
void swap (map& x);
C++
볡μ¬
컨ν
μ΄λ μμμ λ΄μ©μ λ€λ₯Έ 컨ν
μ΄λ μμμ λ΄μ©μ κ΅ννλ€.
β clear
void clear();
C++
볡μ¬
map container λ΄μ λͺ¨λ λ΄μ©μ μμ νλ€.
Observers
β key_comp
key_compare key_comp() const;
C++
볡μ¬
ν€λ₯Ό λΉκ΅νκΈ° μν΄ μ¬μ©λλ λΉκ΅ κ°μ²΄μ 볡μ¬λ³Έμ λ°ννλ€. μ¬κΈ°μ λ§νλ λΉκ΅ κ°μ²΄λ construct λ κ²°μ λλλ° ν
νλ¦Ώ 맀κ°λ³μμ μΈ λ²μ§Έ μμμ΄λ€. κΈ°λ³Έ κ°μ lessμ΄κ³ , operator<μ κ°μ κΈ°λ₯μ μννλ€.
μ΄ λΉκ΅ κ°μ²΄λ μμμ μμλ₯Ό κ²°μ νκ³ μ²« λ²μ§Έ μΈμκ° λ λ²μ§Έ μΈμλ³΄λ€ λ¨Όμ μ€λ©΄ True, μλλ©΄ Falseλ₯Ό λ°ννλ€. λ§μ½ λ ν€κ° κ°μΌλ©΄ Falseλ₯Ό λ°ννλ€.
β value_comp
value_compare value_comp() const;
C++
볡μ¬
mapμ value_typeμ λΉκ΅νμ¬ μμμ μμλ₯Ό λΉκ΅νλ ν¨μ. μ¬κΈ°μ λ§νλ value_typeμ pair<const key_type, mapped_type> μ λ§νλ€. νμ§λ§ μ΄ λΉκ΅μμ mapped_typeμ λΉκ΅λμ§ μλλ€.
Β Set
Setμ Keyκ°λ§ κ°κ³ μλ€λ μ μμ mapμ Keyμ Valueμ μμΌλ‘ μ΄λ£¨μ΄μ Έμλ νΉμ§κ³Ό λ€λ₯΄λ€.
μ΄ μ μ μ μΈνκ³ λ mapκ³Ό setμ νΉμ§μ κ°λ€.
Mapκ³Ό Setμ μ°μ° λ³ μκ° λ³΅μ‘λ
Type | Time complexity |
Find | |
Insert | |
Delete |