如何在std :: map或std :: unordered_map之间切换为类中的容器?

时间:2013-08-08 06:44:39

标签: c++ visual-c++

我在班上有这个ifdef typedef:

#ifdef HASHMAP
    typedef std::unordered_map<unsigned int, L1Entry> L1; //C++ 11 only
#else
    typedef std::map<unsigned int, L1Entry> L1;
#endif

我需要控制在创建类的新对象时使用的容器。这样做的最佳方法是什么?

2 个答案:

答案 0 :(得分:6)

使容器成为类的模板参数:

template<typename MapType>
class MyClass
{
public:
    // ...

private:
    MapType myMap;
};

你会像这样实例化:

MyClass< std::map<unsigned int, L1Entry> > obj;
MyClass< std::unordered_map<unsigned int, L1Entry> > obj2;

标准库中有一个容器正是这样做的,默认情况下看一下std::queue它是用std::deque实现的,但你可以指定另一个容器,只要这个容器提供某些容器操作

这是另一个版本,您只需指定std::mapstd::unordered_map

#include <map>
#include <unordered_map>

typedef size_t L1Entry;

template<template <typename...> class Container>
class MyClass
{
    typedef Container<int, L1Entry> MapType;
public:
    // ...

private:
    MapType myMap;
};

int main()
{
    MyClass<std::map> obj;
    MyClass<std::unordered_map> obj2;
}

OK!这是最终版本,向您展示如何在.h / .cpp中拆分代码(除了我标记的部分外,所有内容都在.h中):

#ifndef MYMAP_H
#define MYMAP_H

#include <map>
#include <unordered_map>
#include <iostream>

typedef size_t L1Entry;

template<template <typename...> class Container>
class MyClass
{
    typedef Container<int, L1Entry> MapType;
public:
    void printMap();

private:
    MapType myMap;
};

// START OF CPP CHUNK (replace with #include <whatever.h>)
template<template <typename...Args> class Container>
void MyClass< Container >::printMap()
{
    // ... do the actual printing
    std::cout << "You'd print stuff here." << std::endl;
}
// END OF CPP CHUNK

#endif // MYMAP_H

这将是main.cpp:

#include "mymap.h"

int main()
{
    MyClass<std::map> obj;
    MyClass<std::unordered_map> obj2;

    obj.printMap();
    obj2.printMap();

    return 0;
}

答案 1 :(得分:0)

你是说这个吗?

  #ifdef __GXX_EXPERIMENTAL_CXX0X__ //Checks for C++11
      typedef std::unordered_map<unsigned int, L1Entry> L1; //C++ 11 only
  #else
      typedef std::map<unsigned int, L1Entry> L1;
  #endif