Как указывалось в предыдущем ответе, сложность составляет O (n) в обоих случаях, и для сравнения характеристик необходимы меры.
Однако я хотел бы добавить два пункта:
Во-первых, сравнение производительности может зависеть от компилятора, от того, как выполняется оптимизация.
Второй момент более критичен: производительность может зависеть от входного массива.
Например, пустьрассмотрим угловой случай: 1,1,1, .., 1, 2
, то есть огромное число 1
, за которым следует один 2
.При втором подходе вы создадите огромный временный массив индексов, чтобы в конце предоставить массив из одного элемента.В конце можно переопределить размер памяти, выделенной этому массиву.Тем не менее, мне не нравится идея создать временный ненужный огромный вектор, независимо от производительности по времени.Обратите внимание, что такой массив может пострадать от нескольких перераспределений, что повлияет на производительность по времени.
Вот почему в общем случае, без каких-либо знаний о входных данных, я бы предпочел ваш первый подход, два сканирования.Ситуация может отличаться, если вы хотите реализовать функцию, предназначенную для определенного типа данных.