Initialisation of static vector

In C++03, the easiest way was to use a factory function:

std::vector<int> MakeVector()
{
    std::vector v;
    v.push_back(4);
    v.push_back(17);
    v.push_back(20);
    return v;
}

std::vector Foo::MyVector = MakeVector(); // can be const if you like

"Return value optimisation" should mean that the array is filled in place, and not copied, if that is a concern. Alternatively, you could initialise from an array:

int a[] = {4,17,20};
std::vector Foo::MyVector(a, a + (sizeof a / sizeof a[0]));

If you don't mind using a non-standard library, you can use Boost.Assignment:

#include <boost/assign/list_of.hpp>

std::vector Foo::MyVector = boost::list_of(4,17,20);

In C++11 or later, you can use brace-initialisation:

std::vector Foo::MyVector = {4,17,20};

Typically, I have a class for constructing containers that I use (like this one from boost), such that you can do:

const list<int> primes = list_of(2)(3)(5)(7)(11);

That way, you can make the static const as well, to avoid accidental modifications.

For a static, you could define this in the .cc file:

// Foo.h

class Foo {
  static const vector<int> something;
}

// Foo.cc

const vector<int> Foo::something = list_of(3)(5);

In C++Ox, we'll have a language mechanism to do this, using initializer lists, so you could just do:

const vector<int> primes({2, 3, 5, 7, 11});

See here.