2016-04-06 54 views
2

我正在尋找一個向量的所有元素轉換爲cv::Point或其他用戶定義的結構類型,一個良好的和現代的方式:演員元素,用戶定義類型

struct ColorSpacePoint 
{ 
    int X; 
    int Y; 
} 

struct NewColorSpacePoint 
{ 
    int X; 
    int Y; 
} 

std::vector<ColorSpacePoint> points{ColorSpacePoint{2,3}, ColorSpacePoint{9,6}}; 

std::vector<NewColorSpacePoint> = ... 
std::vector<cv::Point> = ... 

回答

3

你可以轉換操作符添加到ColorSpacePoint

struct ColorSpacePoint 
{ 
    int X; 
    int Y; 
    operator NewColorSpacePoint() { return {X,Y}; } 
}; 

或非明確的構造函數NewColorSpacePoint

struct NewColorSpacePoint 
{ 
    int X; 
    int Y; 
    NewColorSpacePoint (const ColorSpacePoint& rhs) : X{rhs.X}, Y{rhs.Y} {} 
}; 

ŧ他會讓你只需要使用std::vector範圍構造:

std::vector<NewColorSpacePoint> new_points {points.begin(), points.end()}; 

如果你寧願不使用隱式轉換,你可以做一個免費的功能和使用std::transform

NewColorSpacePoint to_new_color (const ColorSpacePoint& csp) { 
    return {csp.X,csp.Y}; 
} 

std::vector<NewColorSpacePoint> new_points; 
new_points.reserve(points.size()); 
std::transform(points.begin(), points.end(), 
       std::back_inserter(new_points), to_new_color); 
+0

+1了轉換選項 - 在我看來這是要走的路。它允許這些類保持更多的封裝並且更簡單;稍後更新您的班級類型不需要編輯每個班級轉換爲另一班級 – johnbakers

1

ColorSpacePoint添加轉換操作符到NewColorSpacePointcv::Point,如:

struct NewColorSpacePoint 
{ 
    int X; 
    int Y; 
}; 

struct ColorSpacePoint 
{ 
    int X; 
    int Y; 
    operator NewColorSpacePoint() { return {X, Y}; } 
}; 

然後使用的std::vector這需要迭代器的範圍爲參數constructor

std::vector<ColorSpacePoint> points{ColorSpacePoint{2,3}, ColorSpacePoint{9,6}}; 
std::vector<NewColorSpacePoint> new_points(points.begin(), points.end()); 

或者使用std::vector::insert

std::vector<NewColorSpacePoint> new_points; 
new_points.insert(new_points.end(), points.begin(), points.end());