2015-11-16 4 views
2

У меня есть следующий код:Простой станд :: сортировать не работает

int main() 
{ 
    int intArr[] = { 1,5,3 }; 
    //auto f = [](auto a, auto b) {return a < b;}; 
    //std::sort(intArr, intArr + 2, f); 
    std::sort(intArr, intArr + 2); 
    for (int& temp : intArr) 
     cout << temp << endl; 
} 

Однако выход несортированный (например, выход 1 5 3). Тот же результат при использовании std::sort с лямбдой. Что вызывает такое поведение?

Я использую Visual C++ компилятор (Visual Studio 2015).

+4

'станд :: сортировать (intArr, intArr + 3);' – juanchopanza

+0

Вы только сортировать первые два элемента. –

+0

http://stackoverflow.com/questions/5897319/how-to-use-stdsort-to-sort-an-array-in-c – juanchopanza

ответ

6

В алгоритмах STL, которые имеют диапазоны, если вы хотите, чтобы обеспечить весь диапазон, который вы должны дать как окончание такому элементу одной пришедших к концу, и не конец самого диапазона, таким образом, в вашем случае:

std::sort(intArr, intArr + 3); 

Или

std::sort(intArr, intArr + sizeof(intArr)/sizeof(int)); 

Или еще лучше:

std::sort(std::begin(intArr), std::end(intArr)); 
+0

Несомненно, 'sizeof (intArr)/sizeof (intArr [0])'? Именно поэтому версия 'std :: end' лучше; избегает всяких распространенных ошибок! – Andrew

+0

@Andrew Никогда не отлаживайте при стоянии. Тханк исправлен. – 101010

2

у вас есть 3 значения в массиве, но отправлять только 2 (так как в алгоритмах STL второй параметр равен past-end iterator). Должно быть

std::sort(intArr, intArr + 3); 
Смежные вопросы