-
[C++] λ±μ κ°λ κ³Ό STL Deque μ¬μ©λ²Algorithm & Data Structure 2022. 1. 18. 22:47λ°μν
λ€μ΄κ°λ©°
λ±(Deque)μ Double Ended Queueμ μ½μλ‘ νμ μμͺ½ λμμ μμλ₯Ό μΆκ°νκ±°λ μμ λ₯Ό ν μ μλ μλ£κ΅¬μ‘°μ΄λ€. κ·Έλ¦¬κ³ C++ STLμ λ±μ΄ ꡬνλμ΄ μμ΄ μ½κ² μ΄μ©ν μ μλ€!
λ±(Deque) μ΄λ?
λ±(deque, "deck"κ³Ό λ°μμ΄ κ°μ ← double-ended queue)μ μμͺ½ λμμ μ½μ κ³Ό μμ κ° λͺ¨λ κ°λ₯ν μλ£ κ΅¬μ‘°μ ν ννμ΄λ€.
λ κ°μ ν¬μΈν°λ₯Ό μ¬μ©νμ¬, μμͺ½μμ μμ μ μ½μ μ λ°μμν¬ μ μλ€. νμ μ€νμ ν©μΉ ννλ‘ μκ°ν μ μλ€.
- μν€λ°±κ³Όλ±
λ±μ λν΄μ μλμ μ¬μ§μ λ³΄κ³ μ΄ν΄ν΄λ³΄μ.
μ μ¬μ§μ 보면 μμ 32λ₯Ό backμ λ£μ΄μ λ± μμ μμκ° 5, 17, 32κ° λ€μ΄μκ² λλ€. μ¬κΈ°μ frontμ μλ μμ 5λ₯Ό μ κ±°νλ©΄ λ± μμ 17, 32κ° λ¨κ² λλ€. κ·Έλ¦¬κ³ μμ 54λ₯Ό frontμ λ£μ΄μ 54, 17, 32κ° λλ€. κ·Έλ¦¬κ³ backμ μλ μμ 32λ₯Ό μ κ±°νλ©΄ λ± μμ 54, 17μ΄ λ¨κ² λλ€.
λ±μ μ±μ§
- μμλ₯Ό μΆκ°νκ±°λ μμλ₯Ό μ κ±°νκΈ° μν΄μ O(1)μ μκ° λ³΅μ‘λκ° νμνλ€.
- μ μΌ μλ¨μ μμμ μ μΌ νλ¨μ μμλ₯Ό νμΈνκΈ° μν΄μ O(1)μ μκ° λ³΅μ‘λκ° νμνλ€.
- μ μΌ μλ¨μ μλ μμμ μ μΌ νλ¨μ μλ μμλ₯Ό μ μΈν λλ¨Έμ§ μμλ€μ νμΈνκ±°λ λ³κ²½νλ κ²μ μμΉμ μΌλ‘ λΆκ°λ₯νλ€. (νμ§λ§, STL Dequeμμλ μΈλ±μ€λ‘ μμμ μ κ·Όν μ μλ€. STL Stackκ³Ό STL Queueμμλ λΆκ°λ₯νλ€!)
STL Deque
μλλ deque ν€λ νμΌμ μ μΈμ΄λ€.
#include <deque> ...
Deque μ μΈ
#include <iostream> #include <deque> using namespace std; int main(void) { deque<int> DQ; // λΉμ΄μλ int deque μ μΈ return 0; }
Deque κ° μΆκ°
dequeμ κ°μ μΆκ°νκΈ° μν΄μ λ κ°μ§ λ°©λ²μ μ¬μ©ν μ μλ€. λ±μ μ μΌ μμ κ°μ μΆκ°νκΈ° μν΄μ push_front() ν¨μλ₯Ό μ¬μ©νκ³ , λ±μ μ μΌ λ€μ κ°μ μΆκ°νκΈ° μν΄μ push_back() ν¨μλ₯Ό μ¬μ©νλ€. κ·Έλ¦¬κ³ insert() ν¨μλ₯Ό μ΄μ©ν΄ νΉμ μμΉμ κ°μ μΆκ°ν μλ μλ€.
#include <iostream> #include <deque> using namespace std; int main(void) { deque<int> DQ; // λΉμ΄μλ int deque μ μΈ DQ.push_front(1); // 1 DQ.push_back(2); // 1 2 DQ.push_front(3); // 3 1 2 DQ.insert(DQ.begin() + 1, 5); // 3 5 1 2 return 0; }
Deque ν¬κΈ°
dequeμ ν¬κΈ°λ₯Ό ꡬνκΈ° μν΄μλ size() ν¨μλ₯Ό μ¬μ©νλ€. κ·Έλ¦¬κ³ dequeκ° λΉμ΄μλμ§ νμΈνκΈ° μν΄ empty() ν¨μλ₯Ό μ¬μ©νλ€.
#include <iostream> #include <deque> using namespace std; int main(void) { deque<int> DQ; // λΉμ΄μλ int deque μ μΈ DQ.push_front(1); // 1 DQ.push_back(2); // 1 2 DQ.push_front(3); // 3 1 2 DQ.insert(DQ.begin() + 1, 5); // 3 5 1 2 cout << DQ.size() << '\n'; // 4 if (!DQ.empty()) { cout << "deque is not empty!" << '\n'; } return 0; }
Deque κ° μμ
dequeμ κ°μ μμ νκΈ° μν΄μ λ κ°μ§ λ°©λ²μ μ¬μ©ν μ μλ€. λ±μ μ μΌ μμ μλ κ°μ μμ νκΈ° μν΄μ pop_front() ν¨μλ₯Ό μ¬μ©νκ³ , λ±μ μ μΌ λ€μ μλ κ°μ μμ νκΈ° μν΄μ pop_back() ν¨μλ₯Ό μ¬μ©νλ€. κ·Έλ¦¬κ³ erase() ν¨μλ₯Ό μ΄μ©ν΄ νΉμ μμΉμ κ°μ μμ ν μ μκ³ clear() ν¨μλ₯Ό μ΄μ©ν΄ λ±μ μλ λͺ¨λ μμλ€μ μμ ν μ μλ€.
#include <iostream> #include <deque> using namespace std; int main(void) { deque<int> DQ; // λΉμ΄μλ int deque μ μΈ DQ.push_front(1); // 1 DQ.push_back(2); // 1 2 DQ.push_front(3); // 3 1 2 DQ.insert(DQ.begin() + 1, 5); // 3 5 1 2 cout << DQ.size() << '\n'; // 4 if (!DQ.empty()) { cout << "deque is not empty!" << '\n'; } DQ.pop_front(); // 5 1 2 DQ.pop_back(); // 5 1 DQ.erase(DQ.begin() + 1); // 5 DQ.clear(); // { } return 0; }
Deque κ° νμΈ
dequeμ μ μΌ μμ μλ μμμ κ°μ νμΈνκΈ° μν΄μ front() ν¨μλ₯Ό μ¬μ©νκ³ , dequeμ μ μΌ λ€μ μλ μμμ κ°μ νμΈνκΈ° μν΄μ back() ν¨μλ₯Ό μ¬μ©νλ€. κ·Έλ¦¬κ³ μΈλ±μ€λ₯Ό μ΄μ©ν΄ μμμ κ°μ νμΈν μ μλ€.
#include <iostream> #include <deque> using namespace std; int main(void) { deque<int> DQ; // λΉμ΄μλ int deque μ μΈ DQ.push_front(1); // 1 DQ.push_back(2); // 1 2 DQ.push_front(3); // 3 1 2 DQ.insert(DQ.begin() + 1, 5); // 3 5 1 2 cout << DQ.size() << '\n'; // 4 if (!DQ.empty()) { cout << "deque is not empty!" << '\n'; } cout << DQ.front() << '\n'; // 3 cout << DQ.back() << '\n'; // 2 cout << DQ[1] << '\n'; // 5 return 0; }
λ°μν