抛弃 const 是错误的,因为 map<> 上的 operator[] 将创建该条目,如果它不存在默认构造的字符串。如果地图实际上是在不可变存储中,那么它将失败。必须如此,因为 operator[] 返回一个非常量引用以允许赋值。(例如,m[1] = 2)
实现比较的快速免费功能:
template<typename CONT>
bool check_equal(const CONT& m, const typename CONT::key_type& k,
const typename CONT::mapped_type& v)
{
CONT::const_iterator i(m.find(k));
if (i == m.end()) return false;
return i->second == v;
}
如果我想到什么,我会考虑语法糖和更新。
...
直接的语法糖涉及一个自由函数,它执行 map<>::find() 并返回一个包装 map<>::const_iterator 的特殊类,然后重载 operator==() 和 operator!=() 以允许与映射类型进行比较。因此,您可以执行以下操作:
if (nonmutating_get(m, "key") == "value") { ... }
我不相信这比:
if (check_equal(m, "key", "value")) { ... }
而且它肯定要复杂得多,发生的事情也不那么明显。
包装迭代器的对象的目的是停止使用默认构造的数据对象。如果您不在乎,则只需使用“获取”答案。
为了回应关于 get 比比较更受欢迎的评论,希望能找到一些未来的用途,我有以下评论:
说出您的意思:调用一个名为“check_equal”的函数可以清楚地表明您正在进行相等比较而无需创建对象。
我建议仅在您有需要时才实施功能。在此之前做某事往往是错误的。
根据情况,默认构造函数可能会产生副作用。如果你在比较,为什么要做额外的事情?
SQL 参数:NULL 不等于空字符串。容器中缺少键是否与容器中存在具有默认构造值的键真的相同?
说了这么多,默认构造的对象等效于在非常量容器上使用 map<>::operator[] 。也许您当前需要一个返回默认构造对象的 get 函数;我知道我过去有过这样的要求。