Is my Insertion Sort optimal?
Your insertionSort() is OK, but I would write:
template&lt;std::forward_iterator Iter&gt;
void insertion_sort(Iter first, Iter last) {
    for (Iter it = first; it != last; ++it)
        std::rotate(std::upper_bound(first, it, *it), it, std::next(it));
}

insertion_sort(v.begin(), v.end());

display() copys your vector, so make the parameter as const (lvalue) reference.
Use ranged-for loop for printing:
for (auto n : vec) {
    std::cout &lt;&lt; n &lt;&lt; ' ';
}
std::cout &lt;&lt; '\n'; // don't use std::endl

Or you can use one-liner
std::copy(v.begin(), v.end(), std::ostream_iterator&lt;int&gt;(std::cout, ' '));