2016-04-06 52 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());