doc_unordered_set.cpp 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2006-2013
  4. //
  5. // Distributed under the Boost Software License, Version 1.0.
  6. // (See accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. //
  9. // See http://www.boost.org/libs/intrusive for documentation.
  10. //
  11. /////////////////////////////////////////////////////////////////////////////
  12. //[doc_unordered_set_code
  13. #include <boost/intrusive/unordered_set.hpp>
  14. #include <vector>
  15. #include <functional>
  16. #include <boost/functional/hash.hpp>
  17. using namespace boost::intrusive;
  18. class MyClass : public unordered_set_base_hook<>
  19. { //This is a derivation hook
  20. int int_;
  21. public:
  22. unordered_set_member_hook<> member_hook_; //This is a member hook
  23. MyClass(int i)
  24. : int_(i)
  25. {}
  26. friend bool operator== (const MyClass &a, const MyClass &b)
  27. { return a.int_ == b.int_; }
  28. friend std::size_t hash_value(const MyClass &value)
  29. { return std::size_t(value.int_); }
  30. };
  31. //Define an unordered_set that will store MyClass objects using the base hook
  32. typedef unordered_set<MyClass> BaseSet;
  33. //Define an unordered_multiset that will store MyClass using the member hook
  34. typedef member_hook<MyClass, unordered_set_member_hook<>, &MyClass::member_hook_>
  35. MemberOption;
  36. typedef unordered_multiset< MyClass, MemberOption> MemberMultiSet;
  37. int main()
  38. {
  39. typedef std::vector<MyClass>::iterator VectIt;
  40. //Create a vector with 100 different MyClass objects
  41. std::vector<MyClass> values;
  42. for(int i = 0; i < 100; ++i) values.push_back(MyClass(i));
  43. //Create a copy of the vector
  44. std::vector<MyClass> values2(values);
  45. //Create a bucket array for base_set
  46. BaseSet::bucket_type base_buckets[100];
  47. //Create a bucket array for member_multi_set
  48. MemberMultiSet::bucket_type member_buckets[200];
  49. //Create unordered containers taking buckets as arguments
  50. BaseSet base_set(BaseSet::bucket_traits(base_buckets, 100));
  51. MemberMultiSet member_multi_set
  52. (MemberMultiSet::bucket_traits(member_buckets, 200));
  53. //Now insert values's elements in the unordered_set
  54. for(VectIt it(values.begin()), itend(values.end()); it != itend; ++it)
  55. base_set.insert(*it);
  56. //Now insert values's and values2's elements in the unordered_multiset
  57. for(VectIt it(values.begin()), itend(values.end()), it2(values2.begin())
  58. ; it != itend; ++it, ++it2){
  59. member_multi_set.insert(*it);
  60. member_multi_set.insert(*it2);
  61. }
  62. //Now find every element
  63. {
  64. VectIt it(values.begin()), itend(values.end());
  65. for(; it != itend; ++it){
  66. //base_set should contain one element for each key
  67. if(base_set.count(*it) != 1) return 1;
  68. //member_multi_set should contain two elements for each key
  69. if(member_multi_set.count(*it) != 2) return 1;
  70. }
  71. }
  72. return 0;
  73. }
  74. //]