2009-09-04 4 views
-1

나는 boost :: bimap을 가지고 있으며 주어진 위치의 값을 다른 STL 호환 컨테이너에 추가하기 위해 모든 위치를 반복하기를 원합니다. . 어떻게해야합니까?어떻게하면 std :: for_each와 boost :: bimap을 사용할 수 있습니까?

std::for_each(mybimap.left.begin(), 
       mybimap.left.end(), 
       boost::bind(&vector::push_back, &myvec, 
       boost::bind(...))); 
+4

그리고 ... (여기에 오류 설명 넣기) 때문에 작동하지 않습니까? – liori

답변

4

이 작동합니다 :

이 시도 당신이에서 대신 값에 매핑되는 매핑 된 키 값을 의미하는 경우

std::for_each(mybimap.left.begin(), 
       mybimap.left.end(), 
       boost::bind(&vector_type::push_back, &myvec, 
        boost::bind(&map_type::left_map::value_type::second, _1))); 

... 나, second 대신 first를 사용 .

편집

: 나는이 이중 결합이 오히려 서투른 발견하고 for_each이 아닌 최적의 알고리즘 (알고리즘 이름이 의도를 명시해야 이럴 copy이 더 적합 할 것이다 그리고 여기에 명확하게 사본이다). 또한 여기에 transform iterator 사용할 수 있습니다

std::copy(boost::make_transform_iterator(mybimap.left.begin(), select_second()), 
      boost::make_transform_iterator(mybimap.left.end(), select_second()), 
      std::back_inserter(myvec)); 

select_second는 한 쌍의 두 번째 요소를 선택하는 함수 객체가 될 것입니다 경우 - 또는 단지 boost::bind(&map_type::left_map::value_type::second, _1). 나는 기본적으로 (어떤 로켓 과학 쓰기 없음) 쓰기 전에 요소에 적용되는 단항 기능을 소요 back_inserter입니다 직장에서 transform_back_inserter 작성 가지고 transform_iterator를 사용할 수없는 상황에

- 다음 내가 단항 함수 이름을 반복 할 필요가 없기 때문에 가능하면 transform_iterator을 선호하는 경향이

std::copy(mybimap.left.begin(), 
      mybimap.left.end(), 
      transform_back_inserter(myvec, select_second())); 

과 같을 것이다.

1

당신은 당신이 부스트 :: bimap 성병에 이르기까지 모든 것을 복사 할 것 같습니다 게시 된 코드에서 판단 :

내 접근 방식은 부스트 ​​:: 바인드와 함께 표준 :의 for_each를 사용하는 것이 었습니다 : :벡터.

  std::copy(mybimap.left.begin(), 
        mybimap.left.end(), 
        std::back_inserter(myvec)); 
+0

이것은 작동하지 않습니다. 고전적인 for-loop를 사용하여 주어진 요소를 중재하기로 결정했습니다. –

0

&vector<your_value_type>::push_back을 대신 사용해보십시오.

관련 문제