책장을 생각하자.
임의의 위치에 있는 원소를 확인, 변경, 원소를 끝에 추가, 마지막 원소 제거는 O(1)의 시간이 걸린다.
하지만 임의의 위치에 원소를 추가, 제거하는 것은 O(N)이다. 책을 다 밀어야 대기 때문.
가운데 끼어넣는 다고 생각해보자. 그럼 책을 오른쪽으로 밀어야 할 것이다.
근데 왼쪽부터 옮긴다고 하면, 원래 있던 원소가 사라지게 된다.
void insert(int idx, int num, int arr[], int& len){
for(int i = len; i > idx; i--)
arr[i] = arr[i-1];
arr[idx] = num;
len++;
}
그럼 지울 때는? 왼쪽부터 처리를 해주면 된다.
void erase(int idx, int arr[], int& len){
len--;
for(int i = idx; i < len; i++)
arr[i] = arr[i + 1];
}
int a[20];
int b[20][20];
//1. memset
memset(a, 0, sizeof a);
memset(b, 0, sizeof b);
//2. fill
fill(a, a+20, 0);
fill(&b[0][0], &b[0][0] + 20 * 20, 10);
fill이 실수할 일도 없고 편하다. fill은 algorithm 헤더에 있다.
vector에서 모든 원소를 순회할 때, range-based for loop을 사용하는 것이 편하다.
vector<int> v1 = {1, 2, 3, 4, 5, 6};
for(int e : v1) cout << e << ' ';
여기서 size()를 써서 한다면,
//2.
for(int i = 0 ; i < v1.size(); i++) cout << v1[i] << ' ';
//3.
for(int i = 0 ; i < v1.size()-1;i++) cout << v1[i] << ' ';
2번같이 쓰는 경우 올바르게 실행이 되지만, 3번같이 쓰면 안 된다.
vector의 size()는 시스템에 따라 unsigned int 혹은 unsigned long long을 반환하므로, 이상하게 될 수 있다.