Во-первых, векторы (и все классы контейнеров STL) всегда выделяются из кучи, поэтому вам не нужно об этом беспокоиться. Для любого контейнера с переменным размером практически невозможно использовать стек.
Если вы думаете о том, как работает распределение стека (во время компиляции, в основном путем увеличения указателя для каждого объекта), тогда должно быть ясно, что векторная память происходит из кучи.
std::vector<int> myInts;
std::string myString;
SomeOther Class;
// this memory must come from the heap, there's no way it
// can now be allocated on the stack since there are other
// objects and these parameters could be variable
myString = "Some String";
myInts.reserve(256);
Если вы не используете рекурсивную функцию, вы можете поместить несколько килобайт данных в стек без особого беспокойства. Размеры стеков контролируются программой (а не ОС), и значение по умолчанию обычно колеблется от 32 КБ до 1 МБ. Большинство настольных программ выпускается в диапазоне 1 Мб.
Отдельные объекты почти никогда не являются проблемой. В общем случае они либо будут достаточно малы для стека, либо будут выделяться внутри кучи.
Если объекты являются локальными для функции, поместите их в стек. Если не положить их в кучу.
Используйте кучу для больших буферов, которые вы выделяете для загрузки / сортировки / манипулирования данными.