我正在编写一个围绕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;
}
};
答案 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;
}