2016-10-21 1 views
3

에 복사 할 수 있습니까?<code>istream_iterator<int></code> 및 <code>multimap<char, int> output</code>을 사용하면 다중 맵

모든 값을 output'a' 키로 복사하고 싶습니다. 어떻게 처리 할 수 ​​있습니까?

내가 사용하려고했다 :

transform(
    istream_iterator<int>(input), 
    istream_iterator<int>(), 
    begin(output), 
    [](const auto value){ 
     return make_pair('a', value); 
    } 
) 

을하지만 오류를 받고 있어요 :

error: assignment of read-only member std::pair<const char, int>::first

나는 이것이 내가 begin(output)에 쓸 수 있다는 것을 의미합니다 생각합니다. 내 유일한 옵션은 for_each입니까?

답변

7

당신은 매우 가까운,하지만 당신은 std::inserter을 사용해야합니다

transform(
    istream_iterator<int>(input), 
    istream_iterator<int>(), 
    inserter(output, begin(output)), 
    [](const auto value){ 
     return make_pair('a', value); 
    } 
); 

두 번째 매개 변수는 힌트이지만, multimap 것이 무시하는 것입니다. 인터페이스는 당신이 그것을 제공 할 것을 요구합니다.

+0

이것은 원래 질문의 범위를 벗어나지 만 사용할 수 없다면 왜'multimap'은'begin'을 제공합니까? 왜 'cbegin'을 제공하지 않는가? –

+2

@JonathanMee이 작업에서는 사용하지 마세요. 실제'value_type'은'std :: pair '이고'begin (m)'을 사용하여 값을 수정할 수 있습니다. 키를 덮어 쓸 수는 없습니다. 왜냐하면지도를 사용해야하기 때문입니다. const 키가있는'std :: set'을 보면 const가 아닌 반복자를 제공하지 않는다는 것을 알 수 있습니다. – krzaq

+1

아, 그래서'multimap :: begin'에 의해 반환 된 값을 자유롭게 수정할 수 있지만 키를 수정할 필요가 없다는 것을 말하고 있습니다. 이것은 또한 할당 할 수 없다는 것을 의미합니다. 나는 그것을 얻는다, 고마워. 범위 문제를 넘어서서 계속하기 위해서는'output'에 이미 내용이 있다면'inserter (출력, inserter.lower_bound ('a')) '가 맞습니까? –

관련 문제