Я просто нахожу способ подсчитать это количество уникальных предметов в векторе. Это мой самый наивный подход.
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();
Это единственное с или это есть лучший способ в стандартной библиотеке?
Это может зависеть от того, что вы подразумеваете под «лучше», но, безусловно, есть способы, которые проще, и другие, которые, вероятно, быстрее.
Очень простой способ — вставить элементы в 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();
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>
или что-то, если вы предпочитаете.