KisaragiLibrary
 
読み取り中…
検索中…
一致する文字列を見つけられません
OrderedMap.hpp
[詳解]
1#pragma once
2
3/*
4* 特定のキーの順番で管理する連想配列
5*
6*/
7
8#include "unordered_map"
9#include "vector"
10
11
12namespace Kisaragi_Lib
13{
14 /// <summary>
15 /// 順番を持つ連想配列
16 /// </summary>
17 /// <typeparam name="KeyType">連想配列のKey</typeparam>
18 /// <typeparam name="ValueType">連想配列の要素</typeparam>
19 template<typename KeyType, typename ValueType>
21 {
22 private:
23 // key to keyOrder index
24 std::unordered_map<KeyType, unsigned int> keyToIndex;
25
26 // keyの順番を表す
27 std::vector<KeyType> keyOrder;
28
29 // key順に合わせてvalueを格納
30 std::vector<ValueType> value;
31
32 public:
33
34#pragma region コンテナ管理
35
36 /// <summary>
37 /// 要素を末尾に追加する.
38 /// </summary>
39 /// <param name="_key">引数</param>
40 /// <param name="_value">要素</param>
41 void Push(KeyType _key, ValueType _value)
42 {
43 if (keyToIndex.count(_key))
44 {
45 return;
46 }
47
48 keyToIndex.emplace(_key, keyOrder.size());
49 keyOrder.push_back(_key);
50 value.push_back(_value);
51 }
52
53 /// <summary>
54 /// 要素を削除する.
55 /// </summary>
56 /// <param name="_key">削除する要素のKey</param>
57 void Erase(KeyType _key)
58 {
59 if (!keyToIndex.count(_key))
60 {
61 return;
62 }
63
64 //引数を記憶
65 unsigned int index = keyToIndex[_key];
66 //末尾要素の引数を記憶
67 unsigned int lastIndex = keyToIndex.size() - 1;
68
69 //自身が末尾の場合 or 自身のみしか格納してない場合.
70
71 //自身が末尾要素でない場合
72 if (index != lastIndex)
73 {
74 //削除するKey以降のkeyToIndexを削除後に合わせる
75 for (int i = index + 1; i <= lastIndex; i++)
76 {
77 //indexを1下げる
78 keyToIndex[keyOrder[i]]--;
79 }
80 }
81
82 //各配列の削除処理を行う.
83 {
84 //要素の削除
85 value.erase(value.begin() + index);
86 //疎配列の削除
87 keyOrder.erase(keyOrder.begin() + index);
88 //Keyの逆引きを削除
89 keyToIndex.erase(_key);
90 }
91 }
92
93 /// <summary>
94 /// 配列をクリアする
95 /// </summary>
96 void Clear()
97 {
98 keyToIndex.clear();
99 keyOrder.clear();
100 value.clear();
101 }
102
103 /// <summary>
104 /// _key要素があるか検索する
105 /// </summary>
106 /// <param name="_key">検索したい要素のkey</param>
107 /// <returns>存在する : true,存在しない : false</returns>
108 bool FindKey(const KeyType& _key)
109 {
110 return keyToIndex.count(_key);
111 }
112
113
114#pragma endregion
115
116#pragma region 演算子オーバーロード
117 /// <summary>
118 /// 要素を配列として扱う
119 /// </summary>
120 operator std::vector<ValueType>& ()
121 {
122 return value;
123 }
124
125 /// <summary>
126 /// 連想配列の要素を取得する
127 /// </summary>
128 /// <param name="_key">取得したい要素のkey</param>
129 /// <returns>取得した要素</returns>
130 ValueType& operator[](KeyType _key)
131 {
132 if (!FindKey(_key))
133 {
134 assert(false);
135 }
136
137 return value[keyToIndex[_key]];
138 }
139
140
141#pragma endregion
142
143
144
145#pragma region キー管理
146
147 /// <summary>
148 /// 要素順を変更する.
149 /// </summary>
150 /// <param name="_key1">変更したい要素のKey</param>
151 /// <param name="_key2">変更したい要素のKey</param>
152 void SwapKeyOrder(KeyType _key1, KeyType _key2)
153 {
154 //keyが存在するなら.
155 if (keyToIndex.count(_key1)==1 && keyToIndex.count(_key2) == 1)
156 {
157 //順番を入れ替える.
158 keyOrder[value[_key1]] = _key2;
159 keyOrder[value[_key2]] = _key1;
160
161 //対応処理.
162 unsigned int tmp = value[_key1];
163 value[_key1] = value[_key2];
164 value[_key2] = tmp;
165
166 unsigned int tmpIndex = keyToIndex[_key1];
167 keyToIndex[_key1] = keyToIndex[_key2];
168 keyToIndex[_key2] = tmpIndex;
169 }
170 }
171
172 /// <summary>
173 /// 現在のkey順を取得する
174 /// </summary>
175 /// <returns>現在のkey順の配列</returns>
176 const std::vector<KeyType>& KeyOrder()
177 {
178 return keyOrder;
179 }
180
181#pragma endregion
182
183
184 };
185}
順番を持つ連想配列
Definition OrderedMap.hpp:21
void SwapKeyOrder(KeyType _key1, KeyType _key2)
要素順を変更する.
Definition OrderedMap.hpp:152
void Erase(KeyType _key)
要素を削除する.
Definition OrderedMap.hpp:57
const std::vector< KeyType > & KeyOrder()
現在のkey順を取得する
Definition OrderedMap.hpp:176
void Clear()
配列をクリアする
Definition OrderedMap.hpp:96
void Push(KeyType _key, ValueType _value)
要素を末尾に追加する.
Definition OrderedMap.hpp:41
std::vector< KeyType > keyOrder
Definition OrderedMap.hpp:27
std::vector< ValueType > value
Definition OrderedMap.hpp:30
std::unordered_map< KeyType, unsigned int > keyToIndex
Definition OrderedMap.hpp:24
bool FindKey(const KeyType &_key)
_key要素があるか検索する
Definition OrderedMap.hpp:108
ValueType & operator[](KeyType _key)
連想配列の要素を取得する
Definition OrderedMap.hpp:130
Definition Accessor.hpp:110