gpt4 book ai didi

C++ STL:std::find 和 std::map

转载 作者:搜寻专家 更新时间:2023-10-30 23:53:00 24 4
gpt4 key购买 nike

Python 允许您编写 if e in arr: ... if key in dict: ... 这很方便。

我们可以使用 std::find()std::map 对后者做类似的事情吗?这将允许我使用单个通用函数统一处理 std::arraystd::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 时,事情会变得更加复杂(完美转发 etc. ?)

最佳答案

...为什么不编写自己的效用函数?

template <typename TContainer, typename TValue>
bool contains(const TContainer& c, const TValue& x);

您可以使用重载来匹配容器:

template <typename TValue, std::size_t N>
bool contains(const std::array<TValue, N>& c, const TValue& x)
{
return std::find(std::begin(c), std::end(c), x) != std::end(c);
}

template <typename TValue, typename... Ts>
bool contains(const std::map<Ts...>& c, const TValue& x)
{
return c.find(x) != std::end(c);
}

用法:

std::array<int, 2> a{1,2};
std::map<int, int> b{{1,2},{3,4}};

assert(contains(a, 1));
assert(!contains(a, 42));
assert(contains(b, 1));
assert(!contains(b, 42));

live example on wandbox


如果您希望在将来支持更多容器,最好使用 SFINAE 检查特定表达式是否有效。这种方法效果很好,因为它不关心容器的类型,它只关心可以对其执行哪些操作。

detection idiom通过 SFINAE (它的实现是 C++11 兼容的) 可能会非常容易地检查成员可用性。

我还写了一篇关于使用 C++17 原位检查表达式有效性的文章,读起来可能很有趣。尽管标题如此,但它涵盖了用于检查表达式有效性的 C++11、C++14 和 C++17 技术:

"checking expression validity in-place with C++17"

关于C++ STL:std::find 和 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42485829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com