# assign & swap
- assign또한 vector에서의 assign과 동일하다.
- 값을 지우고 다시 넣는다고 생각하면 되겠다.
- deque1.assign(5,6) // 6을 5번 채운다.
- deque2.assign(deque1.begin(), deque1.end()) // deque1의 내용을 복사해서 채운다.
- swap은 값을 바꾼다.(사이즈 달라도 가능)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <iostream> #include <deque> using namespace std; void print(deque<int> deque1) { for(deque<int>::iterator iterPos = deque1.begin(); iterPos != deque1.end(); ++iterPos) { cout << "deque : " << *iterPos << endl; } } int main() { deque<int> deque1; cout << "assign 1" << endl; deque1.assign(5, 6); print(deque1); cout << endl << "assign 2" << endl; deque<int> deque2; deque2.assign(deque1.begin(), deque1.end()); print(deque2); // swap deque<int> deque3; deque3.push_back(10); deque3.push_back(20); deque3.push_back(30); deque3.swap(deque1); cout << endl << "swap" << endl; print(deque1); cout << endl; print(deque3); return 0; } | cs |
* 결과
assign 1
deque : 6
deque : 6
deque : 6
deque : 6
deque : 6
assign 2
deque : 6
deque : 6
deque : 6
deque : 6
deque : 6
swap
deque : 10
deque : 20
deque : 30
deque : 6
deque : 6
deque : 6
deque : 6
deque : 6
* 마지막으로 책에선 또 과제를 내어준다.
1. deque을 이용해 FIFO, LIFO 스택을 구현해라.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <iostream> #include <deque> #include <string.h> using namespace std; template <typename T> class Stack{ public : Stack() { Clear(); } void Clear() { Elements.clear(); } bool IsEmpty() const { return true == Elements.empty() ? true : false; } void SetLIFO(bool LIFO) { m_bLIFO = LIFO; } bool push(T data) { Elements.push_back(data); } bool pop(T* Value) { if(IsEmpty()) return false; if(m_bLIFO) { memcpy(Value, &Elements[Elements.size()-1], sizeof(T)); Elements.pop_back(); } else { memcpy(Value, &Elements[0], sizeof(T)); Elements.pop_front(); } return true; } void print() const { for(int i = 0; i < Elements.size(); ++i) cout << "Stack : " << Elements[i] << endl; } private : deque<T> Elements; bool m_bLIFO; }; int main() { Stack<int> intStack; intStack.push(100); intStack.push(200); intStack.push(300); intStack.SetLIFO(true); int Value; intStack.pop(&Value); cout << "Value : " << Value << endl; intStack.SetLIFO(false); intStack.pop(&Value); cout << "Value : " << Value << endl; return 0; } | cs |
# 결과
Value : 300
Value : 100
2. deque을 사용해서 Undo, Redo를 구현하라.
Undo - deque에 숫자를 저장하고 Undo를 하면 마지막에 넣은 데이터를 뺀다.
Redo - 뺀 데이터를 다시 넣는다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <iostream> #include <deque> using namespace std; deque<int> back_deque; void Undo(deque<int>* Deque) { back_deque.push_back(*(Deque->end()-1)); Deque->pop_back(); } void Redo(deque<int>* Deque) { Deque->push_back(*(back_deque.end()-1)); back_deque.pop_back(); } void print(deque<int> Deque) { for(deque<int>::iterator iterPos = Deque.begin(); iterPos!=Deque.end(); ++iterPos) { cout << "Deque : " << *iterPos << endl; } } int main() { deque<int> deque1; deque1.push_back(100); deque1.push_back(200); deque1.push_back(300); deque1.push_back(400); cout << "Undo Test" << endl; Undo(&deque1); cout << endl << "deque1" << endl; print(deque1); cout << endl << "back_deque" << endl; print(back_deque); cout << endl << "Redo Test "<< endl; Redo(&deque1); cout << endl << "deque1" << endl; print(deque1); cout << endl; cout << "back_deque" << endl; print(back_deque); return 0; } | cs |
# 결과
Undo Test
deque1
Deque : 100
Deque : 200
Deque : 300
back_deque
Deque : 400
Redo Test
deque1
Deque : 100
Deque : 200
Deque : 300
Deque : 400
back_deque
* 참고 : Thinking About C++ STL Programming.