Вывести итератор на набор: назначить и увеличить итератор - PullRequest
0 голосов
/ 02 ноября 2018

Есть много вопросов о выходном итераторе и наборах, но ни один из них не касается этой конкретной темы.

Я пишу функцию для десериализации последовательности объектов в контейнере. Мне бы хотелось, чтобы эта функция была как можно более общей, чтобы контейнер мог быть либо множеством, либо вектором.

Я подумываю получить OutputIterator в качестве аргумента, в котором нужно помещать каждый новый объект по мере его десериализации. Я не уверен, что ожидать при записи в итератор, если контейнер является набором.

Чтобы быть кратким, допустим, что контейнеры в этом примере содержат int вместо указателей на объекты, возвращаемые один за другим getIntFromInput().

void deserializeToContainer(OutputIterator oit){
  while(moreInputAvailable()){
    *oit = getIntFromInput();
    oit++;
  }
}

void deserializeToVector(vector<int> &vectorContainer){
  deserializeToContainer(vectorContainer.back_inserter());
}

void deserializeToSet(set<int> &setContainer){
  deserializeToContainer(setContainer.end());
}

Поскольку set не имеет back_inserter и элементы не сохраняются в порядке их вставки, мне интересно, что ожидать от присваивания *oit и приращения oit, когда контейнер является множеством, как в deserializeToSet

Большое спасибо.

1 Ответ

0 голосов
/ 02 ноября 2018

Вы можете использовать std::insert_iterator (возможно, с std::inserter)

void deserializeToSet(set<int> &setContainer){
  deserializeToContainer(std::inserter(setContainer, setContainer.end()));
}
...