c++ - 防止直接访问 std::map 键
问题描述
我想包装 astd::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()
在循环内。
有没有办法实现这一点,以便客户端可以编写更整洁的代码?
解决方案
do
{
std::cout << "key: " << key << " val: " << value << std::endl;
}while (o.getNextElement(key, value));
所以所有的操作都在这样的循环中。
推荐阅读
- postgresql - 如何比较 Postgresql 中两列的值
- python - 如何修复 pipenv 中的锁定失败?
- php - 在 PHP 电子表格中使用 IF 语句
- azure-sql-database - Azure SQL DB 的 Active Geo Replication 和 Auto Failover Groups 之间的主要区别是什么
- python - 使用 TF Keras 注意力层时无法迭代具有未知第一维的张量
- core-data - 如何在 CoreData+CloudKit 应用程序中修剪历史记录?
- aws-lambda - 未调用无服务器框架 WarmUp 插件
- python - 如何在函数中使用字典中的项目然后循环该函数直到它遍历python中的整个字典
- c++ - Sublime text 在为 c++ 14 创建构建系统时出错
- c# - ASP.NET MVC Post 方法:模型属性不保留值