лучший способ подсчета уникального предмета

Я просто нахожу способ подсчитать это количество уникальных предметов в векторе. Это мой самый наивный подход.

std::vector<Items> v;

// some other work
std::vector<Items> unique_Count;
unique_Count.clear();
std::unique_copy(v.begin, v.end(), std::back_inserter(unique_Count);
int uniqueCount = unique_Count.size();

Это единственное с или это есть лучший способ в стандартной библиотеке?

5

Решение

Это может зависеть от того, что вы подразумеваете под «лучше», но, безусловно, есть способы, которые проще, и другие, которые, вероятно, быстрее.

Очень простой способ — вставить элементы в std::set или же std::unordered_set, Когда вы вставите все из них, размер набора будет равен количеству уникальных предметов.

Вероятно, более быстрый метод будет использовать std::sort а также std::unique чтобы найти уникальные предметы «на месте», а не копировать их. Это хорошенький много чего std::unique_copy обычно все равно будет внутренним, но выполнение этого на месте экономит значительную сумму при выделении и копировании.

std::vector<Items> v;

// populate v with data

std::sort(v.begin(), v.end());
int uniqueCount = std::unique(v.begin(), v.end()) - v.begin();
4

Другие решения

struct iterator_hash {
template<class Iterator>
size_t operator()(Iterator it) const {
using value_type = typename std::decay< decltype(*it) >::type;
return std::hash<value_type>{}( *it );
}
};
struct iterator_element_equals {
template<class Iterator>
size_t operator()(Iterator lhs, Iterator rhs) const {
return *lhs == *rhs;
}
};
std::vector<Items> v;
std::unordered_set<std::vector<Items>::iterator, iterator_hash, iterator_element_equals> s;
for(auto it = v.begin(); it != v.end(); ++it) {
s.insert(it); // not *it
}
size_t uniqueCount = s.size();

здесь я создаю хэш для векторных итераторов, который хэширует и сравнивает базовые элементы (не передавайте его .end() итератор).

Затем я вставляю в него итераторы из набора и спрашиваю, насколько он велик.

Мы могли бы вместо этого использовать std::set<Iterator, iterator_less> или что-то, если вы предпочитаете.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector