Есть ли способ сортировки вектора по сегментам?

Математически целочисленная мощность целого числа является целым числом.

В режиме хорошего качества pow() этот конкретный расчет НЕ должен производить никаких ошибок округления. Я запустил ваш код на Eclipse / Microsoft C и получил следующий вывод:

1   10  100 1000    10000   

Этот тест НЕ указывает, использует ли Microsoft поплавки и округление, или если они обнаруживают тип ваших номеров и выбирают Соответствующий метод.

Итак, я выполнил следующий код:

#include <stdio.h>
#include <math.h>
main ()
{
    double i,a;

    for(i=0.0; i <= 4.0 ;i++)
    {
        a=pow(10,i);
        printf("%lf\t",a);
    }
}

И получил следующий вывод:

1.000000    10.000000   100.000000  1000.000000 10000.000000    
0
задан fxcd 25 March 2019 в 15:43
поделиться

2 ответа

На ум приходят два варианта:

Во-первых, вы можете ограничить свой цикл:

const int SegmentLen = 2;
for (int i=0; i+SegmentLen-1 < arr.size(); i += SegmentLen)
    std::sort(arr.begin()+i, arr.begin()+i+SegmentLen);

Во-вторых, вы можете сделать цикл фиксированное количество раз:

auto segments = arr.size() / SegmentLen;
for (int i=0; i < segments; ++i)
    std::sort(arr.begin() + (i*SegmentLen), arr.begin() + (i*SegmentLen) + SegmentLen);
//Handle any leftovers
0
ответ дан Phil M 25 March 2019 в 15:43
поделиться

Просто получите первое четное число, меньшее или равное размеру массива, а затем используйте его в качестве условия остановки цикла.

int main(){
    std::array<int, 7> arr = {4, 5, 6, 3, 10, 2, 0};
    auto size = arr.size() % 2 ? arr.size() - 1 : arr.size(); // if odd subtract one else use size
    for (size_t i = 0; i < size - 2; i += 2)
        std::sort(arr.begin() + i, arr.begin() + i + 2);
    for (auto e : arr)
        std::cout << e << " ";
}

Выходы:

4 5 3 6 10 2 0 
0
ответ дан NathanOliver 25 March 2019 в 15:43
поделиться
Другие вопросы по тегам:

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