11

ベクトル内の一意のアイテムの数を数える方法を見つけただけです。これは私の最も素朴なアプローチです。

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();

これは標準ライブラリで唯一の方法ですか、それともこれより良い方法ですか?

4

3 に答える 3

13

「より良い」が何を意味するかによって異なりますが、より簡単な方法と、おそらくより高速な方法が確かにあります。

std::set本当に簡単な方法は、アイテムをorに挿入すること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();
于 2015-01-22T23:59:44.263 に答える
3
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()イテレーターに渡さないでください)。

次に、セットの反復子を挿入し、その大きさを尋ねます。

必要に応じて、代わりに astd::set<Iterator, iterator_less>または何かを使用できます。

于 2015-01-28T21:45:04.197 に答える