为UDF std :: unordered_map提供“:”运算符?

时间:2014-01-28 15:43:13

标签: c++ c++11

我正在编写一个围绕std :: unorered_map的包装器但是我有点不确定如何提供一个公共成员函数来访问C ++ 11中“:”功能提供的迭代,例如:

//Iterate through all unoredered_map keys
for(auto x : my_map){
    //Process each x
}

我如何通过围绕unordered_map

的包装提供与上述相同的功能

尝试解决方案:

#include <unordered_map>
#include <mutex>

template<typename T, typename K>
class MyClass{
private:
    std::unordered_map<T,K> map;
    std::mutex mtx;

public:

    MyClass(){}

    MyClass<T,K>(const MyClass<T,K>& src){
        //Going to lock the mutex
    }

    void insert(T key, K value){
        mtx.lock();
        map[T] = K;
        mtx.unlock();
    }

    K operator[](T key) const
    {
        return map[key];
    }

    K get(T key){
        return map[T];
    }

    decltype(map.cbegin()) begin() const 
    { 
        return map.begin(); 
    }

    decltype(map.cend()) end() const { 
        return map.end(); 
    }

    bool count(T key){
        int result = false;
        mtx.lock();
        result = map.count(key);
        mtx.unlock();
        return result;
    }

};

1 个答案:

答案 0 :(得分:14)

只需提供begin()end()方法,返回合适的迭代器。

这是一个有效的例子:

#include <unordered_map>
#include <iostream>
#include <string>
struct Foo
{
  std::unordered_map<std::string, int> m;
  auto begin() const ->decltype(m.cbegin()) { return m.begin(); }
  auto end()   const ->decltype(m.cend())   { return m.end(); }

};


int main()
{
  Foo f{ { {"a", 1}, {"b", 2}, {"c",3} } };

  for (const auto& p : f)
    std::cout << p.first << " " << p.second << std::endl;

  std::cout << std::endl;
}