最終更新日時(UTC):
が更新

履歴 編集

function
<unordered_set>

std::unordered_set::count(C++11)

size_type count(const key_type& x) const;              // (1) C++11
size_type count(const key_type& x, size_t hash) const; // (2) C++20

template <class K>
size_type count(const K& k) const;                     // (3) C++20
template <class K>
size_type count(const K& k, size_t hash) const;        // (4) C++20

概要

キーを検索し、コンテナ内に見つかった要素の数を返す。set コンテナはキーの重複を許さないため、この関数は実際には要素が見つかったときに 1 を、そうでないときに 0 を返す。

  • (1) : キーxを検索し、合致する要素数を取得する
  • (2) : キーxを、事前計算したハッシュ値をつけて検索し、合致する要素数を取得する
  • (3) : キーkを透過的に検索し、合致する要素数を取得する
  • (4) : キーkを、事前計算したハッシュ値をつけて透過的に検索し、合致する要素数を取得する

(3)と(4)の透過的な検索は、Hash::transparent_key_equalが定義される場合に有効になる機能であり、例としてunordered_set<string> s;に対してs.count("key");のようにstring型のキーを持つ連想コンテナの検索インタフェースに文字列リテラルを渡した際、stringの一時オブジェクトが作られないようにできる。詳細はstd::hashクラスのページを参照。

事前条件

戻り値

指定されたキーと同じ値のキーの要素が見つかったなら 1、そうでないなら 0を返す。

メンバ型 size_type は符号なし整数型である。

例外

投げない。

計算量

xkを共通の変数aであるとして、

  • 平均: O(count(a))
  • 最悪: size について線形時間

備考

  • (3), (4) : このオーバーロードは、Hash::transparent_key_equal型が定義される場合にのみ、オーバーロード解決に参加する
  • (2), (4) : これらのオーバーロードは、キーに対するハッシュ値を事前に計算しておくことで、何度も同じキーで検索する場合に高速になる

基本的な使い方

#include <iostream>
#include <unordered_set>
#include <algorithm>
#include <iterator>

int main()
{
  std::unordered_set<int> us{ 1, 3, 5, 7, 9, };

  std::copy(us.begin(), us.end(), std::ostream_iterator<int>(std::cout, ", "));
  std::cout << std::endl;

  auto c1 = us.count(5);
  std::cout << "count of 5:" << c1 << std::endl;

  auto c2 = us.count(8);
  std::cout << "count of 8:" << c2 << std::endl;
}

出力

9, 7, 5, 3, 1,
count of 5:1
count of 8:0

事前計算しておいたハッシュ値を使用する (C++20)

#include <iostream>
#include <unordered_set>
#include <string>

int main()
{
  std::unordered_set<std::string> us = {"Alice", "Bob", "Carol"};

  // ハッシュ値を事前計算
  const char* key = "Alice";
  std::size_t hash = us.hash_function()(key);

  // 事前計算しておいたハッシュ値を、検索インタフェースにキーといっしょに渡すことで、
  // 内部でのハッシュ値計算を省略できる
  if (us.count(key, hash) > 0) {
    auto it = us.find(key, hash);
    std::cout << *it << std::endl;
  }
}

出力

Alice

バージョン

言語

  • C++11

処理系

関連項目

名前 説明
find 指定したキーの位置を検索
equal_range 指定したキーの範囲を取得

参照