如何获取点矢量并仅获取这些点的“y”

时间:2011-10-14 17:52:16

标签: c++ vector

不幸的是,我的数学能力和目标-c / c / c ++的开发还不足以理解如何做到这一点。

我有一个这样的矢量设置:  [2,2,3,3,4,4,5,5,6,6]< - 我想那些矢量设置是否正确?

这是我认为应该设置的内容:

vector<CGPoint>::iterator i;
    vector<CGPoint>* dp = xGraph.GraphPoints;
    for(i = dp->begin(); i != dp->end(); ++i){
        /* grab y points only code here*/
    }

现在我想写一些for语句,它需要xGraph.GraphPoints并且只能抓住y coords。 并且...我想把它放到另一个只有y coords的矢量中,在代码完成后看起来像[2,3,4,5,6]

有人可以帮助我吗?

干杯

3 个答案:

答案 0 :(得分:2)

您的矢量设置不像[2,2,3,3,4,4,5,5,6,6]。它的设置如下:[(2,2),(3,3),(4,4),(5,5),(6,6)]。也就是说,它是一个数字的列表,而不仅仅是一个数字列表。要获取向量中每个元素的y组件,可以编写如下循环:

vector<CGPoint>* dp = xGraph.GraphPoints;
for(i = dp->begin(); i != dp->end(); ++i){
    /* grab y points only code here*/
    CGFloat current_y = i->y;
}

答案 1 :(得分:2)

好的,我对您的问题的解释是,您有一个包含CGPoint个对象的向量,并且您只想从所有点中提取y坐标。在这种情况下,你需要类似的东西(使用C ++ 11 lambdas):

std::vector<CGFloat> ycoord;
std::transform( dp->begin(), dp->end(), std::back_inserter( ycoord ), 
                []( CGPoint const & p ){ return p.y; } );

如果编译器不支持lambda,你可以编写一个简单的函数来执行提取:

CGFloat extractY( CGPoint const & p ) {
   return p.y;
}
std::transform( dp->begin(), dp->end(), std::back_inserter( ycoord ), 
                &extractY );

或者是仿函数:

struct extractYfunctor {
   CGFloat operator()( CGPoint const & p ) const {
      return p.y;
   }
};
std::transform( dp->begin(), dp->end(), std::back_inserter( ycoord ), 
                extractYfuctor() );

如果您可以使用boost库:

std::transform( dp->begin(), dp->end(), std::back_inserter( ycoord ),
                boost::bind( &CGPoint::y, _1 ) );

或者使用普通循环:

for ( std::vector< CGPoint >::const_iterator it = dp->begin(); it != dp->end(); ++it ) {
   ycoord.push_back( it->y );
}

答案 2 :(得分:1)

vector<CGPoint>::iterator i;
vector<CGPoint>* dp = xGraph.GraphPoints;
vector<CGFloat> dp = yPoints;
for(i = dp->begin(); i != dp->end(); ++i){
    yPoints.push_back(i->y);
}

向量确实在内存中布局,但不是逻辑上的。不要过分思考。它仍然是CGFloat个对象的向量。