C API 들 중에 배열을 받아서 처리 하는 함수들이 많이 있다. 이 함수들에 vector와 string이 들어 갈수가 있는데, 왜 이 두 STL 만 들어가냐하면, ... 이 두 STL은 배열을 기반으로 만들어진 STL이기에, 실제로 메모리가 연속되어서 할당된 것이다.
예를 들어
std::vector v; 가 있고, 10개의 요소가 있다면, &v[0]이 그 첫번째 주소이고 size(); 함수 호출에 리턴되는 값만큼 연속적으로 쌓여 있다는 이야기이다.
여기서 주의 해야 할 것은 &v[0], size()를 넘겨서 대개는 잘 작동 하는데, 그 이유는 이 배열을 루틴 내에서 크기변경을 하지 않기 때문이다. 반대로 잘 작동 안하는것은 v의 크기가 루틴내에서 변경되기 때문이다. 또한 v에 아무 인자도 없다고 하더라고 &v[0]은 컴파일은 잘 되나, 그 결과가 .. 예측할수 없다는 점을 미리 알린다.
자... vector에 결론이 보인다. ..
배열처럼 쓸수 있지만. 루틴 내에서 v의 요소 갯수를 감소시키거나 추가 해서는 안된다는 것이다.
이제 string에 대해서 이야기 해보자. 스트링은 string[0] .. 뭐 이런것이 없기 때문에, 별도로 string.c_str()을 지원하여 char*를 뱉어낸다.
여기서 주의 해야 할 것은 c_str()은 가리킨 문자의 포인터가 아니라, 그 문자열의 사본을 가리키는 포인터를 뱉는 함수이다. 그렇기 떄문에 변경을 되어도 사본이 변경이 된것이라고 한다.(이건 좀 실험해 봐야겠는걸..)
예를 들어
std::vector v; 가 있고, 10개의 요소가 있다면, &v[0]이 그 첫번째 주소이고 size(); 함수 호출에 리턴되는 값만큼 연속적으로 쌓여 있다는 이야기이다.
여기서 주의 해야 할 것은 &v[0], size()를 넘겨서 대개는 잘 작동 하는데, 그 이유는 이 배열을 루틴 내에서 크기변경을 하지 않기 때문이다. 반대로 잘 작동 안하는것은 v의 크기가 루틴내에서 변경되기 때문이다. 또한 v에 아무 인자도 없다고 하더라고 &v[0]은 컴파일은 잘 되나, 그 결과가 .. 예측할수 없다는 점을 미리 알린다.
자... vector에 결론이 보인다. ..
배열처럼 쓸수 있지만. 루틴 내에서 v의 요소 갯수를 감소시키거나 추가 해서는 안된다는 것이다.
이제 string에 대해서 이야기 해보자. 스트링은 string[0] .. 뭐 이런것이 없기 때문에, 별도로 string.c_str()을 지원하여 char*를 뱉어낸다.
여기서 주의 해야 할 것은 c_str()은 가리킨 문자의 포인터가 아니라, 그 문자열의 사본을 가리키는 포인터를 뱉는 함수이다. 그렇기 떄문에 변경을 되어도 사본이 변경이 된것이라고 한다.(이건 좀 실험해 봐야겠는걸..)
'책 정리 > Effective STL' 카테고리의 다른 글
항목 21 : 연관 컨테이너용 비교 함수는 같은 값에 대해 false를 반환해야 한다. (0) | 2008.07.19 |
---|---|
항목 20 : 포인터를 저장하는 연관 컨테이너에 대해서는 적합한 비교(비교함수) 타입을 정해주자 (0) | 2008.07.18 |
항목 19 : 상등 관계(equality)와 동등 관계(equivalence)의 차이를 파악하자 (0) | 2008.07.18 |
항목 18 : vector<bool> 보기를 돌 같이 하자. (0) | 2008.07.17 |
항목 17 : 쓸데없이 남은 용량은 "바꿔치기(swap) 묘수"를 써서 없애 버리자. (0) | 2008.07.17 |
항목 15 : 잊지 말자! string은 여러 가지 방식으로 구현되어 있다는 사실을... (0) | 2008.07.16 |
항목 14 : reserve는 필요 없이 메모리가 재할당되는 것을 막아 준다. (1) | 2008.07.16 |
항목 13 : 동적으로 할당한 배열보다는 vector와 string 이 낫다. (0) | 2008.07.15 |
항목 12 : STL 컨테이너의 쓰레드 안전성에 대한 기대는 현실에 맞추어 가지자. (0) | 2008.07.15 |
항목 11 : 커스텀 할당자를 제대로 사용하는 방법을 이해하자. (0) | 2008.07.15 |
최근댓글