상등관계는 operator= 에 의해서 비교되는 것으로 두 객체가 나타낸는 값이 동일한지를 판단한다.
동등관계는 operator< 에 의해서 비교되는 것으로 두 객체가 다른가를 판단한다.
위의 동등을 코드로 표현해 보면
if( !(w1<w2) && !(w2<w1) )
{
// 동등하다
}
else
{
// 동등하지 않다.
}
!c.key_comp()(x,y) && !c.key_comp()(y,x)
상등관계는 operator= 에 의해서 비교되는 것으로 두 객체가 나타낸는 값이 동일한지를 판단한다.
동등관계는 operator< 에 의해서 비교되는 것으로 두 객체가 다른가를 판단한다.
위의 동등을 코드로 표현해 보면
if( !(w1<w2) && !(w2<w1) )
{
// 동등하다
}
else
{
// 동등하지 않다.
}
!c.key_comp()(x,y) && !c.key_comp()(y,x)
vector<bool> 은 STL 컨테이너가 아니다
만약 bool 컨테이너가 필요하다면 deque<bool> 이나 bitset 을 사용하도록 하자.
어떤 vector가 있다고 할때 push_back, insert 나 범위 생성자로 vector의 할당된 용량이 늘어나 버렸다면 erase 등을 호출 하여 데이타를 삭제한다고 해도 이미 할당된 용량이 줄어들지는 않는다.
이런 경우
vector<Object>(v).swap(v);
vector<Object> v;
string s;
…
vector<Obect>().swap(v);
string().swap(s);
vector<int> v 라는 객체가 있을때 int* 를 받는 함수에 넘기는 방법은 &v[0] 을 사용하면 된다.
vector는 연속된 메모리로 컨테이너를 관리하므로 저렇게 넘기면 배열을 사용하는 C언어 함수에서도 문제될것이 없다.(반복자 begin을 사용하는 경우를 생각해 볼수 있지만 반복자는 엄연히 반복자객체이지 배열의 시작포인터를 의미하지는 않는다. vector에서 이 둘이 같은것을 의미할 지라도 두개의 개념은 분리해서 사용하는것이 옳다.)
주의사항
|
string이 기본적으로 가지는 정보
정리
|
vector와 string에 있어서의 메모리 증가는 재할당이란 과정을 거쳐서 이루어 진다.(현재 사이즈의 증가가 아닌 컨테이너에서 할당해놓은 메모리가 부족해 질때)
vector<int> v;
for(int i=0; i<1000; i++) v.push_back(i);
vector<int> v;
v.reserve(1000);
for( int i=0; i<1000; i++ ) v.push_back(i);
string s;
…
if( s.size() < s.capacity() ) s.push_back(‘X’);
참고
|
더 좋다. C형태의 데이타형과 vector, string 간의 데이타 변환은 EffectiveSTL16을 참고하자.
SGI에서 제정한 STL 다중 쓰레딩 지원 항목
|
vector<int> v;
…
{
Lock(v); // 잠근다.
……
} // 자동으로 소멸.
컨테이너네서 특정한 값을 가진 객체를 모두 없애려면
|
|
|
auto_ptr 의 복사의 의미 auto_ptr 하나를 복사(copy)하면, auto_ptr이 가르키는 객체의 소유권은 복사하는 auto_ptr로 옮겨지고 복사되는 auto_ptr은 NULL로 세팅된다. auto_ptr을 복사하는 것은 그 포인터의 값을 바꾸는것 라고 말할수 있다.
auto_ptr<Widget> pw1(new Widget); // pw1은 생선된 Widget을 가르킨다.
auto_ptr<Widget> pw2(pw1); // pw2는 pw1의 Widget을 가르키고
// pw1는 NULL로 세팅된다.
pw1 = pw2; // pw1는 다시 Widget을 가르키고 pw2는 NULL