First of all, since the elements of a std::vector are guaranteed to be contiguous, you can pass it to Bullet with a simple trick:
std::vector<float> dataVector = LoadHeightMap();
float* data = &dataVector[0];
But realize that data is just a pointer, and the data is still stored within the vector. So make sure you keep the vector alive for as long as you need (more on this further below).
About btHeightfieldTerrainShape I'm not sure but I think it makes sense to assume that when passing it an array of floats, they should be normalized in the [0-1] range. Is that what your debugger shows you?
Other than that, make sure you're passing PHY_FLOAT as the heightDataTypeparameter to the constructor, and choose a reasonable minHeight and maxHeight pair of values. It would help if you showed the relevant part of your code.
Also notice this note on the documentation:
The caller is responsible for maintaining the heightfield array; this class does not make a copy.
So make sure you're keeping your vector alive. So if for instance you're just using the vector inside the load method and not storing it somewhere else, your data will be gone by the time the load method returns. Store it as a member variable of your class instead, and then get a pointer to its data with the trick above.
In other words something like:
class Map
{
public:
Map()
{
data = LoadHeightfieldData();
heightfield = new btHeightfieldTerrainShape(..., &data[0], ...);
}
private:
vector<float> data;
btHeightfieldTerrainShape* heightfield;
}
And finally, the length of your data array should obviously correspond to the width * length you specify when creating the heightfield.