Как взять вектор точек и захватить только «y» из этих точек

#c #vector

#c #вектор

Вопрос:

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

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

Приветствия

Комментарии:

1. Если у вас есть вектор<CGPoint> , то вы используете C , а не Objective-C или C. Вы уверены, что не используете C ?

2. Код, который вы показываете, не является C. Вы хотите это перевести?

3. Ваш правильный. Я создаю приложение для ipad, используя все 3. Исправлено

4. j ; если (!(j%2) ) y.push(dp [i] );

5. @JohnRiselvato Я удалил теги [Objective-C] и [C] . Используете ли вы его в других частях своего приложения, на самом деле не влияет на то, что этот конкретный вопрос относится к C .

Ответ №1:

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

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

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

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

Или функтор:

 struct extractYfunctor {
   CGFloat operator()( CGPoint const amp; 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( amp;CGPoint::y, _1 ) );
  

Или с помощью простого цикла:

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

Комментарии:

1. Извлеките только координаты y в другой вектор. но в остальном это ваша правильная интерпретация. позвольте мне еще немного просмотреть ваш код.

2. можете ли вы объяснить it-> y в простом цикле? о, не обращайте внимания на push_back справа. я понял

Ответ №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. это делает current_y вектором? Я пойду почитаю о CGFloat, так как я не понимаю эту строку.

Ответ №3:

 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 объектов.

Комментарии:

1. что такое yPoints будет в моем заголовке?

2. Я не знаю, что ты делаешь. puts it into another vector of only y coords... Это звучит как временная переменная, которой не место в заголовке. Он должен быть локальным для функции.

3. Ах, я понимаю. Как я уже сказал в первой строке, мои навыки программирования не очень продвинуты.