I am writing a wrapper around an std::unorered_map however I am a little uncertain how I should provider a public member function to access the iteration provided by the ":" feature in C++11, for example:
//Iterate through all unoredered_map keys
for(auto x : my_map){
    //Process each x
}
How could I provide the same capability as above, via my wrapper around the unordered_map?
Tried solution:
#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;
    }
};
                Just provide begin() and end() methods, returning suitable iterators.
Here's an working example:
#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;
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With