fork(2) download
  1. #include <set>
  2. #include <time.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. //#include <windows.h>
  6. // ↓代替の定義
  7. namespace
  8. {
  9. typedef long LONG;
  10. typedef struct tagPOINT
  11. {
  12. LONG x;
  13. LONG y;
  14. } POINT;
  15.  
  16. } // namespace
  17.  
  18. namespace
  19. {
  20. class CNode
  21. {
  22. public:
  23. POINT position;
  24. int key1;
  25. int key2;
  26. int key3;
  27. CNode()
  28. {
  29. position.x=rand()%2;
  30. position.y=rand()%2;
  31. key1=rand()%3;
  32. key2=rand()%5;
  33. key3=rand()%10;
  34. }
  35. };
  36.  
  37. /// CNodeへのポインタを保持するクラス
  38. /// これはbool operator<(const T& lhs, const T& rhs)がTがクラス型でないとエラーになるので
  39. /// 回避のため設ける。
  40. struct CNodeHolder
  41. {
  42. CNode* m_pObj;
  43. CNodeHolder(CNode* p) : m_pObj(p) { }
  44. };
  45.  
  46. bool operator<(const CNodeHolder& lhs, const CNodeHolder& rhs)
  47. {
  48. const POINT& a = lhs.m_pObj->position; // Alias
  49. const POINT& b = rhs.m_pObj->position; // Alias
  50. if (a.x != b.x) {
  51. return (a.x < b.x);
  52. } else if (a.y != b.y) {
  53. return (a.y < b.y);
  54. } else {
  55. return false;
  56. }
  57. }
  58.  
  59. /// Optional. 定義してあれば実行効率が増す(ハズ)
  60. bool operator==(const CNodeHolder& lhs, const CNodeHolder& rhs)
  61. {
  62. return (
  63. lhs.m_pObj->position.x == rhs.m_pObj->position.x
  64. && rhs.m_pObj->position.y == rhs.m_pObj->position.y );
  65. }
  66.  
  67. typedef std::set<CNodeHolder> NODE_POINTER_SET;
  68.  
  69. } // namespace
  70.  
  71. int main()
  72. {
  73. srand((unsigned)time(NULL));
  74.  
  75. int NUM=100;
  76. printf("setへの登録候補数:%d\n",NUM);
  77. NODE_POINTER_SET NodePointerSet;
  78. for(int i=0; i<NUM; i++)
  79. {
  80. CNode* const node = new CNode();
  81. printf("%x:(%d,%d)【%3d %3d %3d】をセットへ\n"
  82. ,node
  83. ,node->position.x, node->position.y
  84. ,node->key1, node->key2, node->key3 );
  85. CNodeHolder holder(node);
  86. //重複登録にならないかfind()で確かめてから登録
  87. //find()せずにinsert()すると登録してしまうのでnodeが生ポインタな今回の基本設計下ではヤヴァイ。
  88. auto found_it = NodePointerSet.find(holder);
  89. if (found_it == NodePointerSet.end()) {
  90. //重複登録にならないので追加する。
  91. NodePointerSet.insert(holder);
  92. } else {
  93. //重複登録になるので(追加を行わずに)確保したメモリを破棄する。
  94. delete node;
  95. }
  96. }
  97.  
  98. printf("\nset内に登録された要素数:%d\n",NodePointerSet.size());
  99. for(NODE_POINTER_SET::const_iterator it=NodePointerSet.begin(); it!=NodePointerSet.end(); )
  100. {
  101. printf("%x:(%d,%d)【%3d %3d %3d】をセットから\n"
  102. ,*it
  103. ,(*it).m_pObj->position.x, (*it).m_pObj->position.y
  104. ,(*it).m_pObj->key1, (*it).m_pObj->key2, (*it).m_pObj->key3 );
  105. delete (*it).m_pObj; //メモリの後始末
  106. it=NodePointerSet.erase(it); //setから削除 itは次の要素を指す
  107. }
  108. }
  109.  
Success #stdin #stdout 0s 4256KB
stdin
Standard input is empty
stdout
setへの登録候補数:100
83999e80:(0,0)【  0   1   5】をセットへ
83999ee0:(1,1)【  2   3   7】をセットへ
83999f40:(1,0)【  2   3   1】をセットへ
83999fa0:(0,1)【  2   2   6】をセットへ
8399a000:(1,0)【  1   2   3】をセットへ
8399a000:(1,0)【  2   0   5】をセットへ
8399a000:(0,1)【  2   4   9】をセットへ
8399a000:(0,0)【  0   3   3】をセットへ
8399a000:(1,1)【  2   1   6】をセットへ
8399a000:(0,1)【  2   0   1】をセットへ
8399a000:(1,1)【  1   3   8】をセットへ
8399a000:(1,0)【  1   4   9】をセットへ
8399a000:(1,0)【  2   3   4】をセットへ
8399a000:(0,1)【  0   4   7】をセットへ
8399a000:(1,0)【  1   3   8】をセットへ
8399a000:(0,1)【  2   4   7】をセットへ
8399a000:(1,1)【  0   4   9】をセットへ
8399a000:(1,0)【  0   0   2】をセットへ
8399a000:(1,1)【  0   0   8】をセットへ
8399a000:(0,0)【  2   3   6】をセットへ
8399a000:(1,0)【  2   1   7】をセットへ
8399a000:(1,0)【  0   1   6】をセットへ
8399a000:(0,1)【  2   0   6】をセットへ
8399a000:(0,1)【  1   3   9】をセットへ
8399a000:(1,1)【  1   0   3】をセットへ
8399a000:(1,1)【  0   3   6】をセットへ
8399a000:(1,0)【  1   0   6】をセットへ
8399a000:(0,1)【  2   0   7】をセットへ
8399a000:(1,0)【  0   3   5】をセットへ
8399a000:(1,0)【  2   2   2】をセットへ
8399a000:(1,1)【  0   3   0】をセットへ
8399a000:(0,1)【  2   3   6】をセットへ
8399a000:(0,1)【  2   1   7】をセットへ
8399a000:(1,0)【  1   3   7】をセットへ
8399a000:(1,1)【  1   2   7】をセットへ
8399a000:(1,0)【  2   2   8】をセットへ
8399a000:(0,1)【  1   1   1】をセットへ
8399a000:(0,0)【  1   3   5】をセットへ
8399a000:(0,1)【  1   3   2】をセットへ
8399a000:(1,1)【  1   2   3】をセットへ
8399a000:(0,1)【  0   4   7】をセットへ
8399a000:(1,0)【  0   3   2】をセットへ
8399a000:(0,1)【  2   0   4】をセットへ
8399a000:(0,0)【  2   0   5】をセットへ
8399a000:(0,0)【  0   4   4】をセットへ
8399a000:(0,0)【  2   0   3】をセットへ
8399a000:(1,1)【  0   1   0】をセットへ
8399a000:(0,1)【  1   0   2】をセットへ
8399a000:(1,1)【  1   4   9】をセットへ
8399a000:(0,0)【  1   1   2】をセットへ
8399a000:(1,0)【  1   1   7】をセットへ
8399a000:(0,1)【  1   0   6】をセットへ
8399a000:(0,0)【  2   4   2】をセットへ
8399a000:(0,1)【  1   1   4】をセットへ
8399a000:(0,0)【  2   4   6】をセットへ
8399a000:(1,1)【  1   3   8】をセットへ
8399a000:(0,0)【  1   1   7】をセットへ
8399a000:(1,0)【  2   4   9】をセットへ
8399a000:(1,1)【  1   3   4】をセットへ
8399a000:(1,1)【  0   1   4】をセットへ
8399a000:(1,0)【  1   2   4】をセットへ
8399a000:(0,1)【  1   3   0】をセットへ
8399a000:(1,0)【  2   1   4】をセットへ
8399a000:(0,1)【  0   2   2】をセットへ
8399a000:(1,1)【  2   1   0】をセットへ
8399a000:(1,1)【  0   3   0】をセットへ
8399a000:(1,1)【  0   0   9】をセットへ
8399a000:(0,1)【  0   4   7】をセットへ
8399a000:(0,1)【  0   2   7】をセットへ
8399a000:(1,0)【  2   0   5】をセットへ
8399a000:(1,1)【  0   1   7】をセットへ
8399a000:(0,1)【  1   2   9】をセットへ
8399a000:(1,0)【  2   2   1】をセットへ
8399a000:(1,0)【  1   4   2】をセットへ
8399a000:(1,0)【  1   2   5】をセットへ
8399a000:(1,1)【  2   3   1】をセットへ
8399a000:(1,1)【  0   4   7】をセットへ
8399a000:(1,0)【  2   0   3】をセットへ
8399a000:(1,1)【  0   2   1】をセットへ
8399a000:(1,1)【  2   2   0】をセットへ
8399a000:(1,1)【  1   4   4】をセットへ
8399a000:(0,1)【  1   2   7】をセットへ
8399a000:(0,0)【  0   4   6】をセットへ
8399a000:(1,0)【  2   1   4】をセットへ
8399a000:(1,0)【  2   4   8】をセットへ
8399a000:(1,1)【  2   4   7】をセットへ
8399a000:(1,1)【  1   0   3】をセットへ
8399a000:(0,0)【  1   4   1】をセットへ
8399a000:(0,0)【  2   4   3】をセットへ
8399a000:(0,0)【  2   3   6】をセットへ
8399a000:(1,1)【  1   0   5】をセットへ
8399a000:(0,0)【  0   0   2】をセットへ
8399a000:(1,1)【  2   0   7】をセットへ
8399a000:(1,0)【  2   1   4】をセットへ
8399a000:(0,0)【  2   4   7】をセットへ
8399a000:(1,0)【  0   4   0】をセットへ
8399a000:(0,0)【  1   3   5】をセットへ
8399a000:(1,1)【  2   0   2】をセットへ
8399a000:(0,0)【  1   0   7】をセットへ
8399a000:(0,1)【  0   1   1】をセットへ

set内に登録された要素数:4
83999e80:(0,0)【  0   1   5】をセットから
83999fa0:(0,1)【  2   2   6】をセットから
83999f40:(1,0)【  2   3   1】をセットから
83999ee0:(1,1)【  2   3   7】をセットから