У меня есть функция, которая принимает число и возвращается к тому множеству вещей (скажем, ints). Какой самый чистый интерфейс? Некоторые мысли:
- Верните a
vector<int>
. Вектор будет скопирован несколько раз, что неэффективно. - Верните a
vector<int>*
. Теперь мой получатель должен выделить сам вектор, а также элементы. Есть все обычные проблемы того, кто должен освободить вектор, тот факт, что вы не можете выделить один раз и использовать одно и то же хранилище для множества разных вызовов для получателя и т.д. Поэтому алгоритмы STL обычно избегают выделения памяти, вместо этого он прошел. - Вернуть a
unique_ptr<vector<int>>
. Теперь выясняется, кто его удаляет, но у нас все еще есть другие проблемы. - Возьмите
vector<int>
в качестве эталонного параметра. Геттер можетpush_back()
, и вызывающий может решить, нужно лиreserve()
пробелу. Однако, что должен делать геттер, если переданныйvector
не пуст? Добавьте? Перезаписать, сначала очистив его? Утверждать, что он пуст? Было бы хорошо, если бы подпись функции допускала только одну интерпретацию. - Передайте итератор
begin
иend
. Теперь нам нужно вернуть количество фактически написанных элементов (которые могут быть меньше желаемого), и вызывающему абоненту необходимо быть осторожным, чтобы не обращаться к элементам, которые никогда не записывались. - Получите у получателя
iterator
, и вызывающий может передатьinsert_iterator
. - Откажитесь и просто передайте
char *
.:)