~cpp vector<Type>::itarator // typedef vector<Type>::iterator VTIT 이런식으로 바꿀수 있다. 앞으로는 저렇게 길게 쓰지 않고도 VIIT 이렇게 쓸수 있다.
~cpp vector<Widget> vw; class SpecialWidget : public Widget ... SpecialWidget sw; vw.push_back(sw) // 어떻게 될까. 복사되면서 SpecialWidget만의 특수성은 제거되고, Widget의 특성만 남게 된다.
~cpp vector<Widget*> vw; vw.push_back(new SpecialWidget); // 잘된다.
~cpp // 명시적인 반복문을 쓴다. vector<Object> a,b; b.clear(); for(vector<Object>::const_itarator VWCI = a.begin() + a.size()/2 ; VWCI != a.end() ; ++VWCI) b.push_back(*VWCI)
~cpp // copy 알고리즘을 이용한다. vector<Object> a,b; b.clear(); copy( a.begin() + a.size() / 2, a.end(), back_inserter(b)) ;
~cpp // assign 메소드를 사용한다. vector<Object> a,b; b.assign(a.begin() + a.size() / 2, a.end());
~cpp class Widget {...}; // 디폴트 생성자가 있다고 가정 Widget a // 맞다. Widget b() // 과연?
~cpp ifstream dataFile("ints.dat"); list<int> data(ifstream_iterator<int>(dataFile),ifstream_iterator<int>()); // 이런 방법도 있군. 난 맨날 돌려가면서 넣었는데..--;
~cpp ifstream dataFile("ints.dat"); ifstream_iterator<int> dataBegin(dataFile); ifstream_iterator<int> dataEnd; list<int> data(dataBegin, dataEnd); // 요런식으로 써주자.
~cpp vector<Object*> v; for(int i = 0 ; i < 10 ; ++i) v.push_back(new Object); // new로 넣어줬다. ... ... for(vector<Object*>::iterator i = v.begin() ; i != v.end() ; ++i) delete *i // 지워주자. return 0;
~cpp struct DeleteObject : public unary_function<const T*, void> { template<typename T> void operator()(const T* ptr) const { delete PTR; } }; void f() { ... for_each(v.begin(), v.End(), DeleteObject()); // 정말 이상하군..--; }
~cpp typedef boost::shared_ptr<Object> SPO; // boost 라이브러리라는게 있단다. vector<SPO> v; for(int i = 0 ; i < 10 ; ++i) v.push_back(SPO(new Object));
~cpp c.erase( remove(c.begin(), c.end(), 1982), c.end() ); // 이건 내부적으로 어떻게 돌아가는 걸까. 찾아봐야겠군.
~cpp c.remove(1982);
~cpp c.erase(1982);
~cpp bool badValue(int x) { ... } // 넣어줄 함수 선언
~cpp c.erase( remove_if(c.begin(), c.end(), badValue), c.end() ); // Contiguous-memory Container일때(vector, deque, string)
~cpp c.remove_if(badValue); // list일때
~cpp AssocContainer<int> c; // map,multimap,set,multiset 등을 일반화한 이름이다. 실제로 저런 이름의 컨테이너는 없다.--; ... AssocContainer<int> goodValues; remove_copy_if(c.begin(), c.end(), inserter(goodValues, goodValues.end()), badValue); // 헉 이분법--;. 보면서 느끼는 거지만 정말 신기한거 많다. 저런 것들을 도대체 무슨 생각으로 구현했을지.. c.swap(goodValues); // c랑 goodValues랑 바꾼다. 이런것도 있군.
~cpp AssocContainer<int> c; for(AssocContainer<int>::iterator i = c.begin() ; c != c.end() ; ) { if(badValue(*i)) { c.erase(i++); // 지워야 할 값이면 일단 지우고 반복자 하나 증가시켜준다. 후위 연산자는 그 값을 미리 복사를 하기 떄문에 가능한 일이다. } // 그냥 지우면 그 반복자는 void가 된다. 안좋다--; else ++i; // 아니면 그냥 증가 }