//C++20
#include <iostream>
#include <algorithm>
#include <random>
#include <chrono>
#include <execution>
int main()
{
//политика выполнения
constexpr auto policy =
std::execution::seq
// std::execution::unseq
// std::execution::par
// std::execution::par_unseq
;
size_t count=10'000u;
//генерим в пределах, сопоставимых с количеством
std::mt19937 gen(std::random_device{}());
std::uniform_int_distribution<unsigned int> dis(0u,count);
std::vector<int> v;
v.reserve(count);
for(size_t i=0; i<count; ++i)
{
v.push_back(dis(gen));
}
auto t1=std::chrono::steady_clock::now();
//для алгоритма не нужно, это для отображения результирующего количества
size_t numbers_to_show{};
//сюда копим строку с числами
std::string s;
s.reserve(1024);
for(auto b = std::begin(v), e = std::end(v), cur=b; cur!=e; ++cur)
{
auto& val = *cur;
//в начале - ищем, что нет нигде ДАЛЕЕ
if(cur==b && std::find(policy, cur+1, e, val) != e ) [[unlikely]] {continue;}
//в конце - ищем, что нет нигде ДО
if(cur+1==e && std::find(policy, b, cur+1, val) != cur ) [[unlikely]] {continue;}
//в середине - ищем отсутствие ДО и ПОСЛЕ
if(std::find(policy, b , cur, val) != cur) {continue;}
if(std::find(policy, cur+1, e , val) != e ) {continue;}
s.append(std::to_string(val)).append(",");
++numbers_to_show;
}
auto t2=std::chrono::steady_clock::now();
//вывод чисел на экран отключил
//std::cout << s << '\n';
std::cout <<"numbers to show: "<< numbers_to_show<<'\n';
std::cout <<"time = "<< std::chrono::duration_cast<std::chrono::duration<double,std::milli>>(t2-t1)<<'\n';
}