我想包装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()
。
有没有一种方法可以使客户端编写更整洁的代码?
答案 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'。