2012-01-29 2 views
1

복사가 작동하는 방법에 대한 질문 ... 정신적 인 정숙성을 위해 몇 가지 확인이 필요합니다. 내가있는 경우 :STL Algo Library copy()

multiset<pair<double, string> > myMultiset; 

을 내가 콘솔에 내용을 출력 할 트링있어 사용할 때 ... 나는 오류를 기대한다 :

copy(myMultiset.begin(), myMultiset.end(), ostream_iterator</.../>(cout, " ")); 

를이 때문에 대한 A.입니다 ostream_iterator ostream이 좋아하지 않을 "쌍"유형을 전달하려고합니다. 다중 세트가 "쌍"으로 만들어진 경우에도 "ostream"에 유형 문자열을 전달하더라도 두 요소를 동시에 전달하려고 시도하는 것처럼 오류가 발생합니다. 그냥 키 또는 값을 반복하는 iterator가 있습니까? 이 문제를 해결할 수있는 확실한 방법이 있습니까? 내가 "iter-> first"와 "iter-> second"로 내용을 볼 수 있도록 "for()"루프를 작성할 때마다 ... 나는 STL Algo 's에 익숙하지 않지만 그 아이디어를 좋아한다. 청결도와 나는 그들의 능력을 활용하고 싶습니다 ...하지만 많은 minutae 비록 ...

+1

"기분이 좋니?" 왜 실제로 해보지 않으 시죠? – svick

+1

대답은 여기에있다 : http://stackoverflow.com/questions/312749/providing-aniterator-for-the-first-element-of-a-container-of- pairs –

+0

나는 실제로 그것의 변형을 시도하고 그것이 어디로 가고 있는지 알았습니다. 너무 빨리 너무 빨리하려고하는 것 같아서 ... – MCP

답변

4

std::copy()이 작동하지 않는 이유는 std::pair에 대해 std::operator<<()이 정의되어 있지 않기 때문입니다. 사용자가 텍스트 형식으로 한 쌍을 형식화 할 수있는 많은 합리적인 방법이 있으며 표준에서 정의되지 않은 채로 두었습니다. 당신도 자신의 하나 정의 할 수 있습니다 :

template<typename K, typename V> 
std::ostream& operator<<(std::ostream& out, std::pair<K,V> const& p) 
{ 
    return out << p.first; 
} 

// ... 
std::copy(set.begin(), set.end(), 
      std::ostream_iterator<double>(std::cout, " ")); 

또는 함수를 정의하고 대신 std::transform()를 사용

std::transform(set.begin(), set.end(), 
       std::ostream_iterator<double>(std::cout, " "), 
       [](std::pair<double,std::string> const& p) { 
    return p.first; 
}); 

당신은 키 추출 람다 유용 할 수도 있고, 그것의 유틸리티 펑터를 살이 일을 간단보다 간결하게 않습니다

struct keys_of { 
    template<typename K, typename V> 
    K operator()(std::pair<K,V> const& p) const 
    { 
     return p.first; 
    } 
}; 

// ... 
std::transform(set.begin(), set.end(), 
       std::ostream_iterator<double>(std::cout, " "), 
       keys_of()); 

때로는 for 루프 , 더 메신저 : 재사용 대중적으로 이해할 수있는. 새로운 범위 기반 for 루프는 더욱이 소요 :

for(auto p : set) { 
    std::cout << p.first << ' '; 
} 

이것은 끝에 매달려 공간 구분 기호를 떠나 점에서 다른 방법보다 약간 다른 동작합니다. 또한 컨테이너에서만 작동합니다. 컨테이너가 아니라 한 쌍의 반복자가 있다면 (예 : std::istream_iterator 또는 컨테이너에 임의의 반복자 쌍) 알고리즘을 사용해야합니다. 그러나 나는 그것이 가장 단순하고 가장 분명하다고 생각합니다.

+0

많은 멋진 정보가 있습니다. 감사! – MCP

1

C++ 11을 사용하고 있습니까? 그렇다면 transform 알고리즘을 람다와 함께 사용하여 키 (또는 값)를 추출 할 수 있습니다.

더 오래된 C++에서도 비슷한 일을 할 수 있지만 조금 복잡합니다.