C++ / STL: станд.:: преобразовать данным шагом?

Я имею 1d массив, содержащий Без обозначения даты данные, я хотел бы эффективно пересечь на нем со станд.:: преобразуйте или станд.:: for_each.

unigned int nelems;
unsigned int stride=3;// we are going to have 3D points
float *pP;// this will keep xyzxyzxyz...
Load(pP);
std::transform(pP, pP+nelems, strMover<float>(pP, stride));//How to define the strMover??
6
задан Shyam Bhimani 7 April 2016 в 00:29
поделиться

2 ответа

Что ж, я решил использовать for_each вместо преобразования, любые другие решения приветствуются:

generator<unsigned int> gen(0, 1);
            vector<unsigned int> idx(m_nelem);//make an index
            std::generate(idx.begin(), idx.end(),gen);
            std::for_each(idx.begin(), idx.end(), strMover<float>(&pPOS[0],&m_COM[0],stride));

где

template<class T> T op_sum (T i, T j) { return i+j; }
template<class T> 
class strMover
    {
    T *pP_;
    T *pMove_;
    unsigned int stride_;
    public:
        strMover(T *pP,T *pMove, unsigned int stride):pP_(pP), pMove_(pMove),stride_(stride)
            {}
        void operator() ( const unsigned int ip )
            {
            std::transform(&pP_[ip*stride_], &pP_[ip*stride_]+stride_, 
                pMove_, &pP_[ip*stride_], op_sum<T>);
            }
    };

На первый взгляд это поточно-безопасное решение.

1
ответ дан 17 December 2019 в 04:45
поделиться

Ответ заключается не в изменении strMover , а в изменении вашего итератора. Определите новый класс итератора, который оборачивает float * , но перемещается на 3 позиции вперед при вызове operator ++ .

Вы можете использовать boost Permutation Iterator и использовать нестрогую перестановку, которая включает только интересующий вас диапазон.

Если вы попытаетесь свернуть свой собственный итератор, есть несколько ошибок: оставаться строгим в соответствии со стандартом, вам нужно тщательно подумать о том, какой итератор "конца" для такого итератора шага, поскольку наивная реализация будет весело шагать дальше и дальше разрешенного "один за концом" в темную область далеко за концом массива, в который указатели никогда не должны входить из-за страха назальных демонов .

Но я должен спросить: зачем вы вообще храните массив трехмерных точек как массив float ? Просто определите тип данных Point3D и вместо этого создайте массив. Намного проще.

3
ответ дан 17 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: