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(键、值);
标准::cout
do
{
我猜你想要这个:

if( false == o.empty() )
{
    do 
    {
        std::cout << "key: " << key << " val: " << value << std::endl;
    }while (o.getNextElement(key, value));
}
if(false==o.empty())
{
做
{

std::cout
getFirstElement
被声明为返回一个
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));
}