vector 동적배열이 어떻게 생성되는지 알아보자
C++ 문법 3주차 숙제, 알고리즘 2문제
bool alphabet[26] = {false};
alphabet[word[i] - 'a'] = true;
word[i] - 'a'는 뭘까 뭔데 true일까
26개의 칸이 false로 초기화된 배열alphabet에서 word(받은 단어)[i] = true
word는string자료형 이기 때문에 문자 하나인 word[i]는 char형태로 바뀜 word[0]이 a라고 치면
alphabet[ 'a' - 'a' ] = true; 즉, alphabet[0]일때 true라는것 b - a 는 1 이것은 ASCII코드로 바꾼 값 A= 65, a=97
소문자를 받으면 대문자로 바뀌게 하고싶다
char c = word[i];
if(c >= 'a' && c <= 'z')
c-= 32;
97(a) - 65(A) 인 32를 c에서 빼주면 대문자가 나옴
insert는 기존에 들어있는 데이터를 '원본'으로 간주하고 보호해야 할 때 사용.v.reserve(n)이 크기를 미리 할당해 놓는 거라면 왜 그래야 할까? 그냥 늘어나면 늘어나는대로 크기를 선언하지 않고 그냥 유동적으로 두면 편하지 않을까?
v.rserve(8)과 그냥 vector<int> vec; 선언해두고 나중에 push_back으로 공간을 채운다면 뭐가 다른걸까?
증가 계수가 2배라고 할때
push_back(1): 공간 1개 할당. [1] (Capacity: 1)push_back(2): 공간 부족. **새 공간(2) 할당** → 기존 1 복사 → 기존 1 삭제 [1, 2] (Capacity: 2)push_back(3): 공간 부족. **새 공간(4) 할당** → 기존 1, 2 복사 → 기존 1, 2 삭제 [1, 2, 3] (Capacity: 4)그냥 메모리가 늘어나는게 아니라 공간을 새로 할당할때마다 새로운 메모리에 복사를 하고 기존 메모리는 삭제를 한다는 것 즉, 이사 비용이 발생하게 된다 데이터가 단순히 3개가아니라 몇백만개라면 복사 비용을 무시할 수 없는 수준이 됨
v.reserve(n) 의 n만큼 할당하고 push_back 해주면 됨vector<int> vec(5) 이렇게 할당하는거랑 v.reserve(5)는 뭐가 다른건지 궁금해졌음
vector<int> vec(5);
- 5개의 칸을 만들고 기본값(0으로 채움)
- size 5
- capacity 5
- vec[0] = 10; (기존 값 덮어쓰기)
push_back을 한 경우vec[5]로 6번째 공간에 들어감
vec.reserve(5);
- 5개가 들어갈 공간만 확보 (빈 땅)
- size 0 (아무것도 없음)
- capacity 5
- vec.push_back(10); (새로 집어넣기)
push_back을 한 경우vec[0]으로 1번째 공간에 들어감
vector<int> vec(5); vec.reserve(5);for(int& x : scores)
x += 5;
라는 것을 보고 뭔말인가 싶었음
일단 for( : ) 문은 "오른쪽에 있는 덩어리(scores)에서 알맹이를 하나씩 꺼내서 왼쪽에 선언한 변수(x)에 담아라"라고 약속되어 있다고 함
int& x = scores일때 int scores[4];가 있다고 치면 scores[0]에서 scores[3] 까지 다 한바꾸 돈다는 것
참조이기 때문에 원본 값에 +5임
- A= 65, a= 97
- char 자료형일때 word[i] - 'a' = 하면 숫자를 얻을 수 있음 0 ~ 26
ex) char = a; 일때 char -= 32; == A