禁止直接访问std :: map键

时间:2018-08-19 00:44:25

标签: 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 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;
};

用法为:

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;
    }
}

但是,我不喜欢使用两种方法进行迭代,第一种是在循环外getFirstElement(),然后是然后 getNextElement()

有没有一种方法可以使客户端编写更整洁的代码?

2 个答案:

答案 0 :(得分:0)

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

所以所有操作都在这样的循环内。

答案 1 :(得分:0)

我想你想要这个:

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

在获取元素之前判断它是否为'null'。