Действительно, самый быстрый и, насколько я вижу, самый элегантный метод, как указано выше:
std::vector<int> tUserNumbers;
// ...
std::set<int> tSet(tUserNumbers.begin(), tUserNumbers.end());
std::vector<int>(tSet.begin(), tSet.end()).swap(tUserNumbers);
Это O (n log n). Это, однако, не делает этого, если нужно сохранить порядок чисел во входном массиве ... В этом случае я сделал:
std::set<int> tTmp;
std::vector<int>::iterator tNewEnd =
std::remove_if(tUserNumbers.begin(), tUserNumbers.end(),
[&tTmp] (int pNumber) -> bool {
return (!tTmp.insert(pNumber).second);
});
tUserNumbers.erase(tNewEnd, tUserNumbers.end());
, который по-прежнему равен O (n log n) и сохраняет исходный порядок элементов в tUserNumbers
.
Приветствия
Пол