【发布时间】:2017-07-18 01:42:16
【问题描述】:
Python 允许您编写if e in arr: ... 和 if key in dict: ...,这很方便。
我们可以使用 std::find() 和 std::map 对后者做类似的事情吗?这将允许我使用单个通用函数统一处理 std::array 和 std::map,而无需显式切换到 std::map::find()。
但如果重载operator==()是唯一的办法,我宁愿放弃这个想法......
更新:请注意我已经有一种解决方案
“重载operator==()”我的意思是这样的:
template<typename K>
struct KF {
K&& k;
template <typename V>
friend bool operator==(const typename std::pair<const K, V>& pair, const KF<K>& o) {
return pair.first == o.k;
}
};
template <typename K>
KF<K> keyFinder(K&& k) { return KF<K>{ std::forward<K>(k) }; }
int main() {
std::set<int> s{ 1, 2, };
cout << (std::find(s.begin(), s.end(), 1) == s.end()) << endl; // => 0
cout << (std::find(s.begin(), s.end(), 3) == s.end()) << endl; // => 1
std::map<int, int> m{ {1,10}, {2,20}, };
cout << (std::find(m.begin(), m.end(), keyFinder(1)) == m.end()) << endl; // => 0
cout << (std::find(m.begin(), m.end(), keyFinder(3)) == m.end()) << endl; // => 1
}
当我们以通用方式处理非标量K(完美转发等?)时,事情会变得更加复杂
【问题讨论】:
标签: c++ algorithm dictionary stl iterator