Как взять вектор точек и получить только 'y' из этих точек - PullRequest
0 голосов
/ 14 октября 2011

К сожалению, мои математические способности и цель-c / c / c ++ недостаточно развиты, чтобы понять, как это сделать.

У меня есть вектор, настроенный так: [2,2,3,3, 4,4,5,5,6,6] <- я думаю, вот как векторы настроены правильно? </p>

Это то, что, я думаю, должно быть настроено:

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.и ... я предполагаю, что помещает его в другой вектор только из y координат, который выглядит как [2,3,4,5,6] после завершения кода

Может кто-нибудь помочь мне здесь?

Приветствия

Ответы [ 3 ]

2 голосов
/ 14 октября 2011

Ваш вектор не настроен как [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;
}
2 голосов
/ 14 октября 2011

Хорошо, моя интерпретация вашего вопроса такова, что у вас есть вектор, содержащий CGPoint объекты, и вы хотите извлечь только координату y из всех точек. В этом случае вы хотите что-то вроде (используя лямбды C ++ 11):

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

Если компилятор не поддерживает лямбда-выражения, вы можете написать простую функцию для выполнения извлечения:

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() );

Если вы можете использовать библиотеки повышения:

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 );
}
1 голос
/ 14 октября 2011
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 объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...