2015-01-23 3 views
-3

sort в стандартной библиотеке C++ называется:Вызов станд :: сортировать

sort (first element, last element); 

Так что, если у меня есть массив:

int a[n]; 

я должен назвать sort как:

sort(&a[0], &a[n-1]); 

с a[0] является первым элементом и a[n-1] последним. Однако, когда я это делаю, он не сортирует последний элемент. Чтобы получить полностью отсортированный массив, я должен использовать:

sort(&a[0], &a[n]); 

Почему это?

+2

'std :: sort' работает на итераторах [start inclusive, end exclusive). Вас спросили, почему он спроектирован так? – Mahesh

+0

Конечные итераторы не указывают на какой-либо действительный элемент. '& a [n-1]' делает, и поэтому не используется в качестве конечного итератора. Указатель на один прошлый последний элемент массива C-стиля определенно разрешен как допустимое значение указателя (конечно, вам не разрешено разыгрывать его). –

ответ

6

Поскольку диапазоны в СТЛ всегда определяются как полуоткрытые диапазоны от кулака элемента итератора в «один-пришедшем к концу» -iterator , С C++ 11 вы можете использовать:

int a[n]; 
sort(std::begin(a),std::end(a)); 
+1

следует упомянуть, что 'std :: begin/std :: end()' определены начиная с C++ 11. В противном случае вы можете просто написать свой собственный через передачу массива ссылкой на шаблон или просто использовать 'a [n]' как итератор 'end', так как @Neil Kirk указал – vsoftco

+0

@vsoftco спасибо – TNA

2

Формат рода в STL в C++ есть

sort (first element, last element); 

Нет, это не так. Вы должны предоставить итератор для первого элемента и итератор один-на-конце, как вы обнаружили.

Стандартная библиотека в целом использует semi-open intervals для описания диапазонов через итераторы. В противном случае было бы невозможно для пустых диапазоны должны быть выражены:

// An empty container! 
std::vector<int> v; 

// Pretend that `v.end()` returns an iterator for the actual last element, 
// with the same caveat as `v.begin()` that the case where no elements 
// exist gives you some kind of "sentinel" iterator that does not represent 
// any element at all and cannot be dereferenced 
std::vector<int>::iterator a = v.begin(), b = v.end(); 

// Oh no, this would think that there's one element! 
std::sort(a, b); 
Смежные вопросы