Old Answer (it is about getting the values (DataPoint instances) easily):
Why don't you use a Map, using labels as keys and DataPoint as values(map)? In this way, you will have the data associated, and depeding on the map type, you can have differentiations on complexities(using a map, will have a lookup complexity O(logn), while a hashmap will have O(1) expected and O(n) worst case). Use what works for you better.
For more information on maps and their complexities, look here too: multiset, map and hash map complexity
UPDATE:
To get the label for each DataPoint, one idea is to create a separate class (for example DataContainer) that contains as private members your vector of DataPoint instances and a string that contains your label with the appropriate setters/getters.
class DataContainer{
private:
DataPoint mDataPoint;
string mLabel;
public:
DataContainer(DataPoint dataPoint,string label):
mDataPoint(dataPoint), mLabel(label){}
void setDataPoint(DataPoint dataPoint){
mDataPoint = dataPoint;
}
void setLabel(string label){
mLabel = label;
}
DataPoint getDataPoint(){
return mDataPoint;
}
//This getter does the job, with O(1) complexity.
string getLabel(){
return mLabel;
}
}
This way, you can put your DataContainer in any structure you want (and I suggest map in the case you want to get the keys similarily: map), setting the label on instantiation and getting it with the getter method with O(1) complexity.
As you can see, your question needs to be approached differently, and there are some ways to do it.