если ваши элементы могут быть хэшируемыми, вы можете использовать std::unordered_map<T, int>
для хранения счетчика каждого элемента, который будет занимать амортизированное линейное время:
template<typename T>
std::vector<T> uniqueElements(const std::vector<T>& v) {
std::unordered_map<T, int> counts;
for(const auto& elem : v) ++counts[elem];
std::vector<T> result;
for(auto [elem, count] : counts)
if(count == 1)
result.push_back(elem);
return result;
}
Для небольших списков сортировка, а затем выполнение линейного прохода все еще может быть быстрее.
Также обратите внимание, что это копирует ваши элементы, которые в некоторых случаях могут быть дорогими