LINUX.ORG.RU

Переписать CArray в vector

 , ,


0

1

Хочу переписать неправославный код под линукс, только начал разбираться, и не могу понять что сделал не так.

То что нужно переписать:

void GetFirstDiff(const CArray<double>& arSrc, CArray<double>& arDest)
{       
        CArray<double> arTmp;
        arTmp.SetSize(arSrc.GetCount());
        for (int nPos = 1; nPos < arSrc.GetCount(); nPos++)
        {               
                if(nPos + 1 > arSrc.GetCount() - 1)
                        continue;
                double ndY = arSrc[nPos + 1] - arSrc[nPos];                     
                arTmp.SetAt(nPos, ndY);
        }
        arDest.RemoveAll();  
        arDest.Copy(arTmp);
        arTmp.RemoveAll();
}

То что примерно должно получиться:

void GetFirstDiff(const vector<double>& arSrc, vector<double>& arDest)
{       
        vector<double> arTmp;
        arTmp.resize(arSrc.size());
        int nPos = 1;
        for (vector<double>::iterator nPosIndex = arTmp.begin(); nPos < arSrc.end(); nPos++)
        {      
                nPos++;         
                if(nPos + 1 > arSrc.size() - 1)
                        continue;
                double ndY = arSrc[nPos + 1] - arSrc[nPos];                     
                arTmp.insert(nPosIndex, ndY);
        }
        arDest.clear();  
        arDest.swap(arTmp);
        arTmp.clear();
}


Последнее исправление: hikinus (всего исправлений: 2)

не могу понять что сделал не так.

как минимум это:

nPos++)
        {      
                nPos++ 

сходу бросается в глаза

vaino
()

1. arTmp избыточен. Можно писать сразу в arDest, предварительно ресайзнув его (или очистив, см. ниже).

2. insert вставляет значения, а не устанавливает. Эквивалентом SetAt будет оператор []: arTmp[nPosIndex] = ndY; // Это если nPosIndex был бы индексом, а не итератором.

2а. Итератор для arDest (arTmp) вообще лишний, если добавляешь значения в конец.

2б. arDest.push_back(ndY) будет добавлять в конец списка (если его предварительно очистить).

3. Проверка индекса внутри тела цикла - моветон: for(...; nPos < arSrc.end() - 1; ...)

3а. Дубль nPos++ указал комментатор выше.

4. Простого копипаста лоб-в-лоб и чтения документации по std::vector было бы достаточно. Не мудри, когда не требуется.

5. Если хочешь помудрить (только когда заставишь эту функцию работать), можешь переписать проход по arSrc через итераторы вместо индексов. Дока и примеры в помощь.

schizoid ★★★
()

не могу понять что сделал не так.

Переизобретаешь std::adjacent_difference?

Begemoth ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.