2016-10-21 6 views
3

С учетом istream_iterator<int> и multimap<char, int> output.Могу ли я копировать в multimap

Я хочу скопировать все значения в 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) 'для изменения значения. Вы не можете перезаписать ключ, потому что тогда вам придется прибегнуть к карте. Если вы посмотрите на 'std :: set', где есть только константный ключ, вы заметите, что он не предлагает неконстантный итератор. – krzaq

+1

Ах, вы говорите, что я могу изменить значение, возвращаемое 'multimap :: begin', но не ключ, что также означает, что я не могу назначить. Я понимаю, спасибо. Поэтому для продолжения этих вопросов, выходящих за рамки области, если 'output' уже имел содержимое, которое мне нужно было бы делать' inserter (output, inserter.lower_bound ('a')) ', это правильно? –

 Смежные вопросы

  • Нет связанных вопросов^_^