반응형
시퀀스 컨테이너
double ended queue
요소가 추가되거나 삭제될 때마다 자동으로 메모리를 재할당하여 크기를 동적으로 변경
element가 흩어져 있다. cf ) deque - 단일 배열
멤버 함수
생성
#include <deque>
using namespace std;
int main(){
deque<int> first; // 빈 데크
deque<int> second(4, 100); // 4개의 int(값 100)
deque<int> third(second.begin(), second.end()); // 반복자 사용
deque<int> fourth(third); // 벡터 복사
int myints[] = {1, 2, 3, 4};
deque<int> fifth(myints, myints + sizeof(myints)/sizeof(int)); // 반복자 사용2(배열)
return 0;
}
반복자
- begin() / end()
- rbegin() / rend()
- cbegin() / cend() : const * C++11
- crbegin() / crend() * C++11
#include <iostream>
#include <deque>
using namespace std;
int main(){
deque<int> dq;
for(int i = 1; i <= 5; ++i)
dq.push_back(i);
for(deque<int>::iterator it = dq.begin(); it != dq.end(); ++it)
cout<<*it<<' ';
cout<<'\n';
// 1 2 3 4 5
for(deque<int>::reverse_iterator rit = dq.rbegin(); rit != dq.rend(); ++rit)
cout<<*rit<<' ';
cout<<'\n';
// 5 4 3 2 1
return 0;
}
용량
- size()
- max_size()
- resize()
- empty()
- shrink_to_fit() * C++11
#include <iostream>
#include <deque>
using namespace std;
int main(){
deque<int> dq;
cout << dq.size() << endl;
cout << dq.max_size() << endl;
// 0
// 536870911
for(int i = 1; i <= 5; ++i)
dq.push_back(i);
cout << dq.size() << endl;
cout << dq.max_size() << endl;
// 5 {1, 2, 3, 4, 5}
// 536870911
dq.insert(dq.end(), 10, 100);
cout << dq.size() << endl;
cout << dq.max_size() << endl;
// 15 {1, 2, 3, 4, 5, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100}
// 536870911
dq.pop_back();
cout << dq.size() << endl;
cout << dq.max_size() << endl;
// 14 {1, 2, 3, 4, 5, 100, 100, 100, 100, 100, 100, 100, 100, 100}
// 536870911
return 0;
}
#include <iostream>
#include <deque>
using namespace std;
int main(){
deque<int> dq;
for(int i = 1; i < 10; ++i)
dq.push_back(i);
// 1 2 3 4 5 6 7 8 9
dq.resize(5);
// 1 2 3 4 5
dq.resize(8, 100);
// 1 2 3 4 5 100 100 100
dq.resize(10);
// 1 2 3 4 5 100 100 100 0 0
return 0;
}
#include <iostream>
#include <deque>
using namespace std;
int main(){
deque<int> dq;
int sum = 0;
for(int i = 1; i <= 10; ++i)
dq.push_back(i);
while(!dq.empty()){
sum += dq.back();
dq.pop_back();
}
cout << sum << endl;
// 55
return 0;
}
요소 접근
- []
- at()
- front()
- back()
#include <iostream>
#include <deque>
using namespace std;
int main(){
deque<int> dq(10);
int len = dq.size();
for(int i = 0; i < len; ++i)
dq.at(i) = i;
for(int i = 0; i < len; ++i)
cout << ' ' << dq.at(i);
cout << endl;
// 0 1 2 3 4 5 6 7 8 9
cout << dq.front() << endl;
// 0
cout << dq.back() << endl;
// 9
return 0;
}
제어
- assign()
- push_back()
- pop_back()
- push_front()
- pop_front()
- insert()
- erase()
- swap()
- clear()
- emplace() * C++11
- emplace_back() * C++11
- emplace_front() * C++11
emplace vs insert: construct vs object
#include <iostream>
#include <deque>
using namespace std;
int main(){
deque<int> first;
deque<int> second;
deque<int> third;
first.assign(7, 100); // 사이즈, 값
second.assign(first.begin()+1, first.end()-1); // 반복자, 반복자
int arr[] = {12, 34, 56};
third.assign(arr, arr+3);
cout << first.size() << ' ' << second.size() << ' ' << third.size() << endl;
// 7 5 3
}
#include <iostream>
#include <deque>
using namespace std;
int main(){
deque<int> dq;
for(int i = 1; i <= 5; ++i)
dq.push_back(i);
// 1 2 3 4 5
for(int i = 6; i < 10; ++i)
dq.push_front(i);
// 10 9 8 7 6 1 2 3 4 5
dq.pop_back();
// 10 9 8 7 6 1 2 3 4
dq.pop_front();
// 9 8 7 6 1 2 3 4
}
#include <iostream>
#include <deque>
using namespace std;
int main(){
deque<int> dq(3, 100);
dq.insert(dq.begin(), 200);
dq.insert(dq.begin(), 2, 300);
// 300 300 200 100 100 100
deque<int> dq2(2, 400);
dq.insert(dq.begin() + 2, dq2.begin(), dq2.end());
// 300 300 400 400 200 100 100 100
int arr[] = {501, 502, 503};
dq.insert(dq.begin(), arr, arr+3);
// 501 502 503 300 300 400 400 200 100 100 100
dq.erase(dq.begin()+5);
// 501 502 503 300 300 400 200 100 100 100
dq.erase(dq.begin()+3, dq.begin()+4);
// 501 502 503 400 200 100 100 100
return 0;
}
#include <iostream>
#include <deque>
using namespace std;
int main(){
deque<int> dq1(3, 100);
deque<int> dq2(5, 200);
dq1.swap(dq2);
deque<int>::iterator it;
for(it = dq1.begin(); it != dq1.end(); ++it)
cout << *it << ' ';
cout << endl;
for(it = dq2.begin(); it != dq2.end(); ++it)
cout << *it << ' ';
cout << endl;
// 200 200 200 200 200
// 100 100 100
dq1.clear();
dq1.push_back(1);
for(it = dq1.begin(); it != dq1.end(); ++it)
cout << *it << ' ';
// 1
return 0;
}
할당
- get_allocator()
반응형
'C++' 카테고리의 다른 글
[C++] string library (0) | 2020.11.27 |
---|---|
[C++] cout 부동소수점 다루기 (0) | 2020.11.20 |
[C++] STL - stack (0) | 2020.10.28 |
[C++] STL - vector (0) | 2020.10.28 |
[C++] 반복자 (0) | 2020.10.27 |