반응형

Ion Gaztanaga

the Boost Software 라이센스 하에 배포되어졌다, Version 1.0.

(첨부된 파일을 보세요 LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

Boost.Container 라이브러리는 STL 컨테이너를 포함하면서, 몇몇의 잘알려진 컨테이너들을 수행한다.

라이브러리의 목적이 향상된 특징들을 제공하기위해서 표준안에서 존재하지않거나 또는 최신표준을 제공하기위해서 C++03 을 따르는 컴파일러들에 기초된 특징들이다.

간단히 말해서 , Boost.Container 가 무엇을 제공하는가?

  • 이동의미(론)가 수행되어진다, pre-C++11 컴파일러들에 대한 에뮬레이션을 포함하면서...
  • 새로운 향상된 특징기능들이 존재한다 ( 예를들어 배치삽입(placement insertion), 재귀적 컨테이너들) .
  • 컨테이너들은 stateful 할당기들을 제공하고 Boost.Interprocess(그것들은 공유의 메모리안에서 안전하게 위치되어질수 있다)
    함께 호환된다.
  • 라이브러리들은 새로운 유용한 컨테이너들을 제공한다:
    • flat_map, flat_set, flat_multiset 그리고 flat_multiset: 표준 연관 컨테이너들을 위한 예약없는 교체 그러나
      더 사용하기쉬운 메모리 그리고 더빠른 검색.
    • stable_vector:
      std::list 와 std::vector hybrid 컨테이너:
      vector같은 임의접근 iterators 와 삽입들과 삭제들에서 리스트같은 iterator 안전성.
    • slist: 상수시간 size()을 제공하던 예전의 이전표준 싱글링크드리스트 구현.
      주의 : C++11의 forward_list 은 어떤 size()도 가지지않는다.

Boost.Container를 빌드하는것

Boost.Container를 컴파일할 필요는없다, 그것은 오직 헤더라이브러리이기 때문에.

단지 당신의 컴파일러 include 경로에 당신의 Boost 헤어 디렉토리를 포함시켜라.

Boost.Container는 적절한 C++98 호환성을 필요로한다. 작동하기위한 알려진 몇몇의 컴파일러들이 존재한다 :

  • Visual C++ >= 7.1.
  • GCC >= 4.1.
  • Intel C++ >= 9.0

Last revised: August 15, 2012 at 23:43:58 GMT


효율적인 삽입

이동의미(론)와 배치삽입은 당신의 C++ 어플리케이션들안에서 매우 긍정적인 영향을 가질수 있는 C++1 컨테이너들에의해 제공되어진 두가지 특징들이다. Boost.컨테이너들은 C++과 c++03 컴파일러들 모두를 위해서 두가지의 기술들을 이행한다

Move-aware 컨테이너들

모든 컨테이너들은 이동만가능한 유일한 타입들을 저장할수있는 Boost.컨테이너에 의해서 제공되어지고 value_type을 위한 요구조건들은

각 컨테이너 연산들에 의존한다.

C++3 컴파일러들에서 조차 C++11 필요조건들을 따르면서, 많은 연산들은 단지 복사 생성할수있는 타입들 대신에 이동할수있거나

기본(default) 생성할수있는 타입들을 지금부터 필요로한다.

컨테이너 그것들자체는 또한 이동할수있다, 예외를던지지 않는 보장과함께 만약 allocator나 predicate(있을경우) 복사연산들은 예외를

던지지않는다면..

이것은 고성능 연산들을 가능하게한다 데이터를 벡터들사이에서 옮길때.

예제를 봅시다 :

#include <boost/container/vector.hpp>
#include <boost/move/move.hpp>
#include <cassert>

//Non-copyable 클래스
class non_copyable
{
   BOOST_MOVABLE_BUT_NOT_COPYABLE(non_copyable)

   public:
   non_copyable(){}
   non_copyable(BOOST_RV_REF(non_copyable)) {}
   non_copyable& operator=(BOOST_RV_REF(non_copyable)) { return *this; }
};

int main ()
{
   using namespace boost::container;

   //벡터안에서 noe-copyable 오브젝트들을 저장한다
vector<non_copyable> v; non_copyable nc; v.push_back(boost::move(nc)); assert(v.size() == 1); //Reserve는 복사생성할수있는것을 더이상 필요로하지 않는다 v.reserve(100); assert(v.capacity() >= 100); //이 resize 오버로드는 이동하거나 기본 생성할수있는것을 단지 필요로한다 v.resize(200); assert(v.size() == 200); //컨테이너들은 또한 이동할수있다 vector<non_copyable> v_other(boost::move(v)); assert(v_other.size() == 200); assert(v.empty()); return 0; }

Emplace: 배치 삽입

Boost.Container에 의해 제공되어진 모든 컨테이너들은 배치삽입을 수행한다, 그것은(배치삽입) 오브젝트들이 어떤 임시오브젝트를 생성하는것 없이 사용자 아규먼트들로부터 직접적으로 컨테이너로 만들 수 있다는것을 의미한다.

컴파일러들을 위해 variadic template들없이 배치삽입이 아규먼트들의 한정된 (10)번까지 애뮬레이트되어지도록 지원하시오.

이동하는 값비싼 타입들은 완벽한 후보자들이다

emplace 함수들과 노드컨테이너들(list, set, ...) emplace 의 경우에는 컨테이너들 안에서 이동할수없고 복사할수없는 타입들을

정렬하는것을 허락한다 :

#include <boost/container/list.hpp>
#include <cassert>

//복사할 수 없고 이동할수없는 클래스
class non_copy_movable
{
   non_copy_movable(const non_copy_movable &);
   non_copy_movable& operator=(const non_copy_movable &);

   public:
   non_copy_movable(int = 0) {}
};

int main ()
{
   using namespace boost::container;

   //리스트안에서 복사할수없고 이동할수없는 오브젝트들을 저장한다
   list<non_copy_movable> l;
   non_copy_movable ncm;

   //한 새로운 요소는 만들어질것이다, non_copy_movable(int)생성자를 호출하면서...
   l.emplace(l.begin(), 0);
   assert(l.size() == 1);

   //한 새로운 요소는 만들어질것이다, 기본 생성자를 호출하면서...
   l.emplace(l.begin());
   assert(l.size() == 2);
   return 0;
}



이하 번역대기........


번역된 페이지 http://www.boost.org/doc/libs/1_51_0/doc/html/container.html

http://www.boost.org/doc/libs/1_51_0/doc/html/container/move_emplace.html

반응형

+ Recent posts