C++ 阻止直接访问std::map键
我想包装一个C++ 阻止直接访问std::map键,c++,dictionary,stl,iterator,C++,Dictionary,Stl,Iterator,我想包装一个std::map,这样客户端就不知道我实际上是将它们的正整数键存储为负整数。我需要允许迭代类并访问元素 我想出了这门课: template<class K, class V> class Container { public: Container(){} void insert(const K& key, const V& value) { _map[key] = value; } bool g
std::map
,这样客户端就不知道我实际上是将它们的正整数键存储为负整数。我需要允许迭代类并访问元素
我想出了这门课:
template<class K, class V>
class Container
{
public:
Container(){}
void insert(const K& key, const V& value)
{
_map[key] = value;
}
bool getFirstElement(K& key, V& value)
{
if (false == _map.empty())
{
_iter = _map.begin();
value = _iter->second;
key = std::abs(_iter->first);
return true;
}
return false;
}
bool getNextElement(K& key, V& value)
{
++_iter;
if (_iter != _map.end())
{
key = std::abs(_iter->first); // I modify the key
value = _iter->second;
return true;
}
return false;
}
private:
typename std::map<K, V>::iterator _iter; // Caches client's position whilst iterating
std::map<K, V> _map;
};
模板
类容器
{
公众:
容器(){}
无效插入(常数K和键、常数V和值)
{
_映射[键]=值;
}
布尔getFirstElement(K和键、V和值)
{
if(false==\u map.empty())
{
_iter=_map.begin();
值=_iter->秒;
键=标准::abs(\u iter->first);
返回true;
}
返回false;
}
布尔getNextElement(K&key、V&value)
{
++_iter;
如果(\u iter!=\u map.end())
{
key=std::abs(_iter->first);//我修改了这个键
值=_iter->秒;
返回true;
}
返回false;
}
私人:
typename std::map::iterator _iter;//在迭代时缓存客户端的位置
标准::地图(map);
};
其用途是:
int main()
{
Container<int, int> o;
o.insert(-1, 100);
o.insert(-2, 200);
o.insert(-3, 300);
int key;
int value;
o.getFirstElement(key, value);
std::cout << "key: " << key << " val: " << value << std::endl;
while (o.getNextElement(key, value))
{
std::cout << "key: " << key << " val: " << value << std::endl;
}
}
intmain()
{
集装箱o;
o、 插入(-1100);
o、 插入(-2200);
o、 插入(-3300);
int键;
int值;
o、 getFirstElement(键、值);
标准::coutdo
{
我猜你想要这个:
if( false == o.empty() )
{
do
{
std::cout << "key: " << key << " val: " << value << std::endl;
}while (o.getNextElement(key, value));
}
if(false==o.empty())
{
做
{
std::coutgetFirstElement
被声明为返回一个bool
,但不包含return
语句。对它的任何调用都将显示未定义的行为。您可以实现自定义迭代器以与自定义容器配合使用。@IgorTandetnik很抱歉,我在编写问题后在IDE中更改了它。现在更新。@IgorTandetnik,你能提供一个例子吗?好的,这比我的好,但它仍然要求用户在getNextElement()之前调用getFirstElement()“仍然要求用户调用getFirst…”是什么意思?复制并粘贴我的代码到IDE中,尝试你的解决方案,你就会明白。
if( false == o.empty() )
{
do
{
std::cout << "key: " << key << " val: " << value << std::endl;
}while (o.getNextElement(key, value));
}