[cppll:0055] <tips> 双方向map
- Subject:
- [cppll:0055] <tips> 双方向map
- From:
- Toshihiko 'Chin' Ando <andochin@...>
- Date:
- Tue, 11 Dec 2001 17:48:05 +0900
- X-Mailer:
- WZ MAIL 4.00E
- Message-Id:
- <20011211173010.7764805.-255400089‐at‐ngy.3web.ne.jp>
いつもお世話になっております。
安藤@名古屋市北区在住です。
またまた小ネタです。
以前作ったもの。mapで値からキーが欲しかった時に作成。
これも順次比較するので検索は頗る遅いです。
し・か・も同一の値が複数ある場合のことが考慮されていない…。
//
// 双方向マップ
// 要素からイテレータを返すことが出来るようにする
//
template<class Key, class T, class Pred = less<Key>, class A = allocator<T> >
class mutal_map : public map< Key, T, Pred, A >
{
public:
typedef map<Key, T, Pred, A>::iterator iterator;
//
// 最初に値の一致したイテレータを返す
//
const iterator find_by_value( const T& value ) {
iterator it = begin();
while(it != end()) {
if( it->second == value ) {
break;
}
it ++;
}
return it;
}
//
// 要素を削除
//
bool delete_element( const iterator& it ) {
if(it == end()) {
return false;
}
erase(it);
return true;
}
bool delete_element( Key& value ) { return delete_element(find(value)); }
bool delete_element( T& value ) { return delete_element(find_by_value( value )); }
};
---------------------------------------------------------
Toshihiko 'Chin' Ando
mail : andochin@...
安藤@名古屋市北区在住です。
またまた小ネタです。
以前作ったもの。mapで値からキーが欲しかった時に作成。
これも順次比較するので検索は頗る遅いです。
し・か・も同一の値が複数ある場合のことが考慮されていない…。
//
// 双方向マップ
// 要素からイテレータを返すことが出来るようにする
//
template<class Key, class T, class Pred = less<Key>, class A = allocator<T> >
class mutal_map : public map< Key, T, Pred, A >
{
public:
typedef map<Key, T, Pred, A>::iterator iterator;
//
// 最初に値の一致したイテレータを返す
//
const iterator find_by_value( const T& value ) {
iterator it = begin();
while(it != end()) {
if( it->second == value ) {
break;
}
it ++;
}
return it;
}
//
// 要素を削除
//
bool delete_element( const iterator& it ) {
if(it == end()) {
return false;
}
erase(it);
return true;
}
bool delete_element( Key& value ) { return delete_element(find(value)); }
bool delete_element( T& value ) { return delete_element(find_by_value( value )); }
};
---------------------------------------------------------
Toshihiko 'Chin' Ando
mail : andochin@...
▼ スレッド
- 55: いつもお世話になっております。 以前作ったもの。mapで値からキーが欲しかった時に作成。 し Toshihiko 'Chin' Ando
- └62: なるほど。あたしゃこんなの書いてさらりと逃げました^^; template<class Iterator, class T> Iterator find_b FUKUDA Fumiki
- └63: 別解...のーみそ膿みそう template<class UnaryFunction1, class UnaryFunction2> class unary_compose : public std::unary_f FUKUDA Fumiki
- └64: ちょうど中間くらいだと思いますが、比較関数 equal_to_by_2nd() だ け定義するという手もあります TAKATSUTO Atsushi
- └65: うん、そーゆーわけで select_2nd と compose をこさえてみたです。 アイデア1分実装30分。のーみそ FUKUDA Fumiki
- └82: ちと気になって調べてみたらSGI系STLportには select_1stもcomposeも とっくにサポートされてるんだな FUKUDA Fumiki