В библиотеке C ++ итераторы - это в основном причудливые указатели.Таким образом, стандартно просто увеличивать указатель на конец массива, чтобы получить указатель «конца»:
#include<algorithm>
#include<iostream>
int main() {
int len;
len = 100;
int* arr = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = rand() % 32000;
}
//Valid, Defined Behavior that works as expected
std::sort(arr, arr + len);
//alternative, to make the code easier to read:
//auto begin = arr;
//auto end = arr + len;
//std::sort(begin, end);
for(int i = 0; i < len; i++)
std::cout << arr[i] << std::endl;
}
Однако некоторые компиляторы (например, компилятор Visual Studio) распознают, что такого родакода по своей сути небезопасен, потому что вы должны вручную указать длину массива.В результате они вызовут (подавляется с помощью флага компилятора, если вам нужно) ошибку времени компиляции, если вы попытаетесь сделать это, и посоветуют вам использовать вместо этого предоставленную компилятором утилиту:
#include<algorithm>
#include<iostream>
int main() {
int len;
len = 100;
int* arr = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = rand() % 32000;
}
//MSVC Specific Code!
auto begin = stdext::make_checked_array_iterator(arr, len);
auto end = arr + len;
std::sort(begin, end);
for(int i = 0; i < len; i++)
std::cout << arr[i] << std::endl;
}
Подробнее об этом конкретном руководстве по компилятору Visual Studio см. Здесь: https://docs.microsoft.com/en-us/cpp/standard-library/checked-iterators?view=vs-2019