2013-05-04 1 views
2

C++ 프로그램에서 std :: list 및 std :: map (실제로 boost : unordered_map을 사용하고 있지만) 우아한 방법을 알고 싶습니다. 목록에있는 모든 요소를지도에 삽입하는 것. 열쇠는 목록에있는 요소에 대한 메소드 호출의 결과가되고 싶습니다. C++/Boost 수동 루프없이지도에 목록 항목 삽입

그래서 예를 들어 내가 가진 :

std::list<Message> messages = *another list with elements*; 
std::map<std::string, Message> message_map; 

그리고 메시지에있는 모든 메시지의 키 존재의 message.id (과지도에 목록에서 모든 요소)를 삽입 할.

목록을 반복하고 수동으로 수행하지 않고이를 수행 할 수있는 방법이 있습니까? C++ 11을 사용할 수 없지만 C++ 11 솔루션에 관심이 있습니다. 나는 부스트를 사용할 수있다.

감사합니다.

+0

손으로 풀고 일련의'삽입 '을 작성하지 않으면 어딘가에서 루프가 발생합니다. –

+0

좋아, 아마도 나는이 말을 잘못했다. 루프를 직접 작성하고 싶지는 않습니다. 일종의 std :: copy 및 std :: inserter 작업 방식과 비슷합니다. – rpamely

답변

3

는 C++ 11 용액 : 현재 std::map 요소 std::list 소자로부터 변환 std::transform을 사용할 수

상응 람다 대신 함수 포인터를 전달함으로써 C++ 03으로 할 수
std::transform(message.begin(), messages.end(), 
       std::inserter(message_map, message_map.end()), 
       [](const Message& m) { return std::make_pair(m.id(), m); }); 

.

+0

OP는 이것이 대응하는'for' 루프보다 길다는 것을 알아야하며, 이것을 위해 C++ 11이 필요합니다. –

+0

감사합니다. 부스트와 비슷한 것을 할 수 있는지 알고 있습니까? 아마도 바인드를 사용하고 있을까요? – rpamely

+0

나는 boost :: transform이있는 것으로 추측한다. 더 많거나 적은 (아마 완전히) 동일한 구문을 사용한다. (@sftrabbit) 삽입기에서 .begin()을 잊어 버렸습니까? – leemes

0

u는 u는이 루프에 대한보다 낫다 그러나 당신이 펑터

struct map_inserter { 
    std::map<string,Message>& t_map; 
    map_inserter(std::map<string,Message>& t_map) : t_map(t_map) {} 
    void operator()(Message& m) { 
     t_map.insert(std::pair<string,Message>(m.get_id(),m)); 
    } 
}; 

을 사용할 수 있는지

+0

부스트 바인드와 make_pair를 결합하여 인라인이 될 수 있습니까? – rpamely

+0

부스트를 사용하지 마십시오. 그러나 작동 할 것이므로 함수에 람다를 사용할 수 있습니다 – aaronman

2

확실하지 않음) (의 for_each 사용할 수있는 문양의 시작과 끝 반복자를 얻을 수있는 경우 당신은 당신이 사용할 수있는이

std::map<string,Message> t_map; 
std::for_each(vec.begin(), vec.end(), map_inserter(t_map)); 
0

처럼 사용할 수 있습니다 accumulate :

typedef std::map<std::string, Message> MessageMap; 

MessageMap& addIdAndMessage(MessageMap& messageMap, const Message& message) { 
    messageMap[message.id()] = message; 
    return messageMap; 
} 

int main() { 
    std::list<Message> messages; 
    //... 
    MessageMap message_map = 
     accumulate(messages.begin(), message.end(), 
        MessageMap(), 
        addIdAndMessage); 
}