我想出了以下代码,它演示了一种在 STL 集合上进行通用迭代并获取键值的技术,而不管键是如何存储的。
上下文是我正在重构两个函数,它们都在两个集合上运行相同的功能:一个是 a set<int>
,另一个是 amap<int, int>
所以在第一种情况下我想采取行动*it
,在第二种情况下it->first
(其中it
是 const_iterator. )
重要的是,我想这样做,因为集合非常大,我不想简单地set
从map
just 创建一个,所以我只能处理一种特定类型。
#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 解决方案,尽管我对从学术角度使用它的解决方案感兴趣。谢谢。