次のコードを思いついたのは、STLコレクションを一般的に反復処理し、キーの格納方法に関係なくキー値を取得する手法を示しています。
これのコンテキストは、2つのコレクションで同じ機能を操作する2つの関数をリファクタリングしているということです。1つはaで、set<int>
もう1つはmap<int, int>
そうです。 )。*it
it->first
it
重要なのは、コレクションが非常に大きいため、これを実行したいのです。特定のタイプを1つだけ処理できるようにset
、単にからを作成する必要はありません。map
#include <map>
#include <set>
#include <iostream>
using namespace std;
// General case for obtaining from, say, a set.
template< typename T >
const typename T::key_type getKey( const typename T::const_iterator& it )
{
return *it;
}
// Specific case for a map<int,int>
template<>
const map<int, int>::key_type getKey< map<int, int> >( const map<int, int>::const_iterator& it )
{
return it->first;
}
template< typename T >
void dumpOut( T& coll )
{
for ( typename T::const_iterator it = coll.begin(); it != coll.end(); ++it )
{
const typename T::key_type& a = getKey<T>(it);
cout << a << endl;
}
}
int main()
{
set<int> s1;
s1.insert(10);
s1.insert(15);
s1.insert(20);
dumpOut< set<int> >( s1 );
map<int, int> m1;
m1.insert( pair<int, int>(11, -1) );
m1.insert( pair<int, int>(16, -1) );
m1.insert( pair<int, int>(21, -1) );
dumpOut< map<int, int> >( m1 );
return 0;
}
私の質問は次のとおりです。キーと値が実際に何であるかに関係なくmap<int,int>
、アプローチは一般的に明らかに機能するため、もう少し一般的な特殊なケースを作成することは可能ですか。map
任意のポインタ(しゃれは意図されていません)が役立ちます。アカデミックな観点からC++11ソリューションに興味がありますが、C++11ソリューションは使用できませんのでご注意ください。ありがとう。