Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 모달인듯 모달 아닌 뷰
- Reversing
- scroll
- 2020.06.14
- Reverse Engineering
- SWiFT
- 순차 컨테이너
- Stack
- 컴퓨터 구조
- UIView
- Animation
- 백준 10828
- class
- 2020.05.17
- struct
- 스택
- vector
- ios
- stl
- UIPanGestureRecognizer
- list
- 컴퓨터구조
- NavigationBar
- BOJ
- 2020.04.19
- 표준 템플릿 라이브러리
- Constraint
- 알고리즘
- 백준 1920
- Swing
Archives
- Today
- Total
야금야금
[C++] STL 컨테이너 정리(1)_순차 컨테이너 본문
순차 컨테이너
: 자료를 순차적으로 가지고 있으며 자료의 추가는 빠르지만 탐색의 경우 시간이 많이 걸린다.
vector
: 동적 배열처럼 동작하며 뒤에서 자료들이 추가된다.
- 자료의 추가 시 배열의 크기나 타입을 신경 쓰지 않아도 된다.
- 저장할 데이터의 개수가 가변적일때 사용한다.
- 편리성을 위해 연산자들이 중복 정의되어있어 대입 연산(v2 = v1), 비교 연산(v1!= v2 / v1 == v2) 등이 사용 가능하다.
- 임의접근 반복자를 사용할 수 있다. (인덱스 연산자 [ ] 사용 가능)
- 중간에서 데이터의 삽입이나 삭제가 가능하지만 뒤의 모든 요소를 이동해야 하므로 비효율적이다.
- 크기를 미리 선언하지 않아도 되지만 위와 같은 이유로 비효율적이다.
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v1; // int 자료형의 동적 배열 v1 생성
vector<int> v2(10); // 크기가 10인 동적 배열 v2 생성 // 기본적으로 원소는 모두 0으로 초기화
vector<int> v3(10, 1); // 크기가 10인 동적 배열 v3 생성, 모든 원소를 1로 초기화
vector<int> v4(v3); // v3를 복사해서 v4 생성
v1.push_back(4); // v1마지막에 원소 4를 추가
v1.pop_back(); // v1의 마지막 원소 삭제
cout<<v2.size()<<endl; // v2의 크기 출력
v2.resize(5); // v2의 크기 변경
cout<<v3.front()<<v3[n]<<v3.back()<<endl; //v3의 첫번째, n번째, 마지막 원소 출력
v3.begin(); // v3의 첫번째 원소의 iterator 반환
v3.end(); // v3의 마지막 원소의 '다음' iterator 반환
v3.erase(v3.begin()); //v3의 첫번째 원소 삭제
vector<int>::iterator iter = v4.begin();
v4.erase(iter + a -1, iter + b -1); // v3의 [a, b)의 원소 삭제 //v3.erase(v3[a], v3[b])이거 아님
sort(v4.begin(), v4.end()); //오름차순으로 정렬 // v4.sort()이거 아님
v4.clear(); //v3의 모든 원소 삭제, 메모리는 그대로
return 0;
}
list
: 이중연결리스트로 구현된다. 리스트의 양 끝에서 삽입 삭제가 가능하다.
- 벡터와 달리 중간에서 효율적으로 데이터의 삽입·삭제를 할 수 있다.
- 반복자(iterator)를 통해 양방향 이동이 가능하다.
- 인덱스 연산자를 지원하지 않는다. 따라서 어떤 요소에 접근하기 순차적으로 양방향 반복자(++, --)를 사용하여 접근해야 한다. 따라서 검색을 자주 할 경우 비효율적이다.
- 임의 접근 반복자를 필요로 하는 binary_search()와 같은 알고리즘은 적용할 수 없다.
- 각 데이터마다 링크를 저장해야하여 메모리를 더 많이 차지한다.
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> l1; // int 자료형의 리스트 l1 생성
list<int> l2(10); // 크기가 10인 리스트 l2 생성 // 기본적으로 원소는 모두 0으로 초기화
list<int> l3(10, 1); // 크기가 10인 리스트 v3 생성, 모든 원소를 1로 초기화
list<int> l4(l3); // l3를 복사해서 l4 생성
l1.push_back(4); // l1 마지막에 원소 4를 추가
l1.pop_back(); // l1의 마지막 원소 삭제
l1.push_front(3); // l1의 시작에 원소 3을 추가
l1.pop_front(); // l1의 첫 원소 삭제
cout<<l2.size()<<endl; // l2의 크기 출력
l2.reverse(); // l2 순차열 뒤바꿈
cout<<l3.front()<<l3.back()<<endl; //l3의 첫번째, 마지막 원소 출력
l3.begin(); // l3의 첫번째 원소의 iterator 반환
l3.end(); // l3의 마지막 원소의 '다음' iterator 반환
list<int>::iterator iter = l4.begin();
l4.insert(iter, 25); // iter가 가리키는 곳에 25를 삽입
iter=l4.erase(iter);// iter가 가리키는 원소 삭제 후 다음 원소 주소 반환
l4.sort(); //오름차순으로 정렬
l4.clear(); //v3의 모든 원소 삭제, 메모리는 그대로
return 0;
}
'Algorithm' 카테고리의 다른 글
[C++] STL (Standard Template Library) 이란? (0) | 2021.03.30 |
---|