cout — неверный вывод результата в C ++, когда я добавляю оператор

Я пытаюсь найти минимальное и максимальное значение в массиве (размер n) использовать 3 * (n // 2) сравнение времен в эргодическом. И это мой код:

#include <iostream>
#include <initializer_list>
//!
//! @Brief:get the minmum and maxmum in 3 * ( n // 2) times comparison.
//! Create by Soyn. 31/7/15.
//!

bool IsOdd( size_t n)
{
return n % 2 ;
}
std::initializer_list<int> getLargerAndSmaller( int a, int b)
{
if(a <= b){
return {a,b};
}else{
return {b,a};
}
}

int main(void)
{
int  Min, Max;
int a[] = {5,4,1,7,3,8,3,4,9,10};
int n = sizeof(a) / sizeof(a[0]);
for( int i = 0; i < n - 1; i += 2){
if( (i ==0) &&IsOdd(n)){           // initialize the Min and Max.
Min = Max = a[i];
} else{
auto item = getLargerAndSmaller(a[i],a[i+1]);
if(i == 0){
Min = *(item.begin());
Max = *(item.begin() + 1);
std :: cout << "Min: " << Min << " , " << "Max: " << Max << std :: endl;
}else{
std :: cout << *(item.begin()) << " , " << *( item.begin() + 1) << std :: endl;
Min > *(item.begin()) ? Min = *(item.begin()) : Min;
Max < *(item.begin() + 1) ? Max = *(item.begin() + 1) : Max;
std :: cout << "Min: " << Min << " , " << "Max: " << Max << std :: endl;
}
}
}
return 0;
}

Для тестирования моего кода я добавляю в свой код какое-то утверждение, например

std :: cout << *(item.begin()) << " , " << *( item.begin() + 1) << std :: endl;

и это точка, которую я не могу понять. Когда я добавляю это, результат неправильный. Если я это понимаю, это работает хорошо. Ниже приведен неправильный результат изображения:

введите описание изображения здесь

2

Решение

Возвращение функции почти никогда не корректно std::initializer_list потому что они ссылаются на локальный массив.

Когда ты пишешь return {a, b}; или эквивалентно для экспозиции:

std::initializer_list<int> x = { a, b };
return x;

получается, что создается автоматический (стек) массив из 2 элементов, содержащий копии a а также b; и initializer_list Объект содержит ссылку на этот локальный массив.

Итак, когда вы получаете доступ item Вы получаете доступ к свисающей ссылке (неопределенное поведение).


initializer_list не предназначен для использования в качестве контейнера — использовать array или же vector или же pair и т. д.

3

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector