[英]create iterator wrapper class for dereferencing pointers stored in a std container
using HT = std::unordered_map<int, int*>;
class ITERATOR_PROXY
{
public:
ITERATOR_PROXY(HT& container) : m_container(container) { }
auto begin() const { return HT_ITERATOR_WRAPPER(std::begin(m_container)); }
auto end() const { return HT_ITERATOR_WRAPPER(std::end(m_container)); }
auto cbegin() const { return HT_ITERATOR_WRAPPER(std::cbegin(m_container)); }
auto cend() const { return HT_ITERATOR_WRAPPER(std::cend(m_container)); }
private:
struct HT_ITERATOR_WRAPPER
{
HT_ITERATOR_WRAPPER(HT::const_iterator iter_) : iter(iter_) {}
bool operator!=(const HT_ITERATOR_WRAPPER& other) const { return iter != other.iter; }
auto& operator*()
{
//const int& key=iter->first;
//int& val = *(iter->second);
// how to return (key, val) which would allow possible modification?
}
void operator++() { ++iter; }
HT::const_iterator iter;
};
HT& m_container;
};
int main()
{
HT ht;
std::array<int, 5> val = {0,1,2,3,4} ;
for (int i=0;i<5;++i) ht[i]=&val[i];
ITERATOR_PROXY htw(ht);
for(auto& x : htw)
{
// ok, changes the values in val array
x.second += 100;
}
for(const auto& x : htw)
{
// I should expect a compile error in this case
x.second += 100;
}
}
我想有一些方法使用 unordered_map 容器进行基于范围的 for 循环,它将循环内的原始值类型从 int* 更改为 int& ( main() 中的预期用例)。 我在实现 HT_ITERATOR_WRAPPER::operator * 时遇到了一些困难。 在这种情况下它应该返回什么? 我的感觉是我需要将取消引用的元素存储在某个地方并让 *operator 返回对它的引用,但我不知道如何使它工作。
它应该return *iter;
:
auto& operator*(){
return *iter;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.