我正在尝试编写一个模板函数,它将获取一个STL容器,并显示其中所有元素的出现次数以及它们发生的次数。我打算使用一个map,遍历容器并添加一个新元素(如果它不存在)或增加元素的出现次数。
声明:
template < typename Container_t >
void findOccurrences (const Container_t& inContainer);
我的问题是:我可以以某种方式获取容器所包含的元素的类型说明符吗?
因此,当我创建地图时,键值将是inContainer
中的元素。
类似的东西:
map < typeid ( * inContainer.begin()), int > occurrences;
或者我是否必须将模板更改为以下内容:
template < typename Container_t , typename Element_t >
void findOccurrences ( const Container_t & inContainer , Element_t dummy )
{
map < Element_t , int > occurrences;
}
由于
答案 0 :(得分:4)
这样的事情怎么样:
#include <map>
#include <iterator>
template <typename Iter>
void histogram(Iter begin, Iter end)
{
typedef typename std::iterator_traits<Iter>::value_type T;
std::map<T, size_t> h;
while (begin != end) ++h[*begin++];
// now h holds the count of each distinct element
}
用法:的
std::vector<std::string> v = get_strings();
histogram(v.begin(), v.end());
答案 1 :(得分:3)
您想要typename Container_t::element_type
即,
std::map <typename Container_t::element_type, int>
答案 2 :(得分:1)
使用C ++ 0x,它非常简单:
map<decltype(*c.begin()), int> occurrences;
使用C ++ 03,您可能需要使用容器中的typedef:
template<typename Container>
// ...
map<Container::element_type, int> occurrences;
答案 3 :(得分:0)