Jak nazwa wskazuje ten typ smartpointera działa w ten sposób, że jego instancje mogą między sobą dzielić jeden obiekt, czyli możesz mieć dwa(ile chcesz) identyczne shared_ptr'y wskazujące na ten sam obiekt i zmieniając coś w jednym zmieniasz we wszystkich. więc ten w wektorze i ten osobno mają dokładnie taką samą funkcjonalność. Przykład:
#include <iostream>
#include <memory>
#include <vector>
using std::cout;
using std::endl;
using std::cin;
int main()
{
std::shared_ptr<int> obiekt(new int(9));
std::vector<std::shared_ptr<int>> stack;
stack.push_back(obiekt);
cout << *obiekt << " " << *(stack[0]) << endl;
*obiekt = 19;
cout << *obiekt << " " << *(stack[0]) << endl;
*(stack[0]) = 29;
cout << *obiekt << " " << *(stack[0]) << endl;
cin.get();
}