기본 콘텐츠로 건너뛰기

라벨이 insert인 게시물 표시

STL container.emplace ...

C++11의 컨테이너에 emplace 시리즈 메소드가 생겼다. 요놈들은 뭐하는 놈들일까? 일단 내가 전혀 뜻을 모르는 영어단어라 사전을 찾아보니, '설치하다'라고 나온다. 이게 뭐여... 형태도 얄딱꾸리하게 생긴 녀석이다. template< class... Args > iterator emplace( const_iterator pos, Args&&... args ); 이렇게 생긴 녀석인데, 하는 일은 insert나 push_back/push_front 랑 비슷하다. 컨테이너에 원소 하나를 추가하는 일을 한다. 다만 기존 insert/push 시리즈는 넣을 객체를 caller에서 예쁘게 만들어서 전달하는데 이 과정에서 의도치 않게 임시객체가 뿅~하고 만들어지고 사라지는 부하가 생길 수 있다. 반면, emplace는 노드에 추가할 때, 주어진 인자(위에서 args)를 이용하여 객체의 생성자를 호출한다. 따라서 임시객체를 만들지 않거나, 임시객체 생성횟수를 줄여준다. 어지간한 경우에 emplace류가 insert/push류보다 빠르다고는 되어 있는데, effective c++이나 modern c++에서 찾아봐야겠다. 뭔가 함정이 있을 것 같은 느낌이 있달까. * Fundamental types(int, char, long ...)에게는 아무런 의미가 없다~

list::insert, list::erase

STL가 제공하는 list에 insert, erase는 각각 iterator를 반환한다. (형태에 따라 반환하지 않는 것도 있으니 주의) iterator insert(iterator pos, const T& x) : pos 앞쪽에 x를 넣고, x에 대한 iterator를 반환한다. iterator erase(iterator pos) : pos에 해당하는 아이템을 삭제하고, pos 다음 iterator를 반환한다. 예) #include <iostream> #include <list> #include <set> #include <algorithm> using namespace std; typedef list<int> list_int; typedef list_int::iterator list_itr; class print { public: ostream& m_os; print(ostream& os) : m_os(os) {} void operator() (int v) { m_os << v << ' '; } }; template<typename _T> ostream& dump(ostream& os, const _T& cont) { for_each(cont.begin(), cont.end(), print(os)); os << endl; return os; } list_int& init(list_int& cont) { cont.clear(); for ( int i(0); i < 10; i++ ) { cont.push_back(i); } return cont; } template<typename _IteratorType> void testInsert(_IteratorType ib, ...