#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. Ах, я понимаю. Как я уже сказал в первой строке, мои навыки программирования не очень продвинуты.