В C ++ всякий раз, когда функция создает много (сотни или тысячи) значений, я использовал, чтобы вызывающая сторона передавала массив, который моя функция затем заполняет выходными значениями:
void computeValues(int input, std::vector<int>& output);
Итак, функция заполнит вектор output
значениями, которые она вычисляет. Но это не совсем хороший стиль C ++, как я сейчас понимаю.
Следующая сигнатура функции лучше, потому что она не обязывает использовать std::vector
, но может использовать любой контейнер:
void computeValues(int input, std::insert_iterator<int> outputInserter);
Теперь звонящий может позвонить с помощью inserter
:
std::vector<int> values; // or could use deque, list, map, ...
computeValues(input, std::back_inserter(values));
Опять же, мы не обязуемся использовать конкретно std::vector
, что хорошо, потому что пользователю могут просто понадобиться значения в std::set
и т. Д. (Должен ли я передать iterator
по значению или по ссылке? )
Мой вопрос: insert_iterator
правильный или стандартный способ сделать это? Или есть что-то еще лучше?
РЕДАКТИРОВАТЬ: Я отредактировал вопрос, чтобы было ясно, что я говорю не о возврате двух или трех значений, а о сотнях или тысячах. (Представьте, что вы вернули все файлы, которые вы нашли в определенном каталоге, или все ребра на графике и т. Д.)