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

How can I switch between std::map or std::unordered_map as a container in a class?

本文关键字:std map unordereded 之间 何作      更新时间:2023-10-16

我的类中有这个ifdef typedef:

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

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

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

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;
}

好的!这里有一个最终版本,向您展示如何在.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

这将是主要的.cpp:

#include "mymap.h"
int main()
{
    MyClass<std::map> obj;
    MyClass<std::unordered_map> obj2;
    obj.printMap();
    obj2.printMap();
    return 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