Нет специально для этой цели (стандартные алгоритмы пытаются быть более обобщенными). Однако вы могли бы использовать std::accumulate
для одного довольно большого произведения.
Подсказка: сумма набора чисел из 1..N равна (N + 1) * (N / 2).
Редактировать: моя идея ответа состоит в том, чтобы вычесть сумму ваших чисел из суммы, которую вы получили бы, если бы присутствовали все числа. Эта разница будет отсутствующим числом.
#include <numeric>
#include <iostream>
#define elements(x) (sizeof(x)/sizeof(x[0]))
int main() {
int x[] = {8, 4, 3, 5, 1, 2, 7};
int N = elements(x) +1;
int projected_sum = (N+1)*(N/2);
int actual_sum = std::accumulate(x, x+elements(x), 0);
std::cout << "The missing number is: " << projected_sum - actual_sum << "\n";
return 0;
}
На данный момент, это игнорирует несколько незначительных деталей, например, что происходит, если набор имеет нечетное количество элементов, но должен показывать общую идею. Я также использовал массив вместо списка, просто для простоты инициализации. Я не использовал ничего похожего на произвольный доступ, который не может (разумно) поддерживать список. Это имеет линейную сложность и, как видно из примера ввода, не требует сортировки ввода.
Edit2: если намерение состоит в том, что входные данные расположены в отсортированном порядке, я, вероятно, выполнил бы работу немного по-другому: просто пролистайте и найдите элемент, который точно не больше, чем его предшественник.