gpt4 book ai didi

c++ - 如何使用 C++11 中的函数式编程从 map 中获取键?

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

std::map<K,V> m , 在数学观点中,是一个函数 fm 其中所有域和范围元素对 (x,y) ∈ K × V 使得 fm(x) = y.

所以,我想得到 fm 的域,即所有键的集合(或者可能是范围 - 所有值的集合)。我可以使用 C++11 以程序方式完成此操作,如下所示:

std::unordered_set<K> keys;
for (const auto& kv_pair : m) { keys.insert(kv_pair->first); }

对吧?但是 - 我想功能性地(阅读:以一种让我感觉优越的奇特方式)。我该怎么做?

注意事项:

  • 我不一定需要结果是 std::unordered_set;可以替代此类集合的东西也可能会起作用(例如集合 Facade )。
  • 可读性、(合理的)简洁性和避免无故复制数据都是考虑因素。

最佳答案

Boost.Range 正是通过适配器 map_keys 提供的。看this文档中的示例。

你可以这样写:

auto keys = m | boost::adaptors::map_keys;

// keys is a range view to the keys in your map, no copy involved
// you can use keys.begin() and keys.end() to iterate over it

编辑:我将在下面留下我的旧答案,它使用迭代器而不是范围。请注意由两个 boost::transform_iterator 表示的范围仍然表示映射中的键集。

IMO 的函数式 方法需要一个指向映射键的迭代器,这样您就可以简单地使用 std::copy。这是有道理的,因为您没有转换或积累任何东西,您只是复制 key 。

遗憾的是,标准不提供迭代器适配器,但您可以使用 Boost.Iterator 提供的适配器。

#include <algorithm>
#include <map>
#include <unordered_set>
#include <boost/iterator/transform_iterator.hpp>

struct get_first
{
template<class A, class B>
const A & operator()(const std::pair<A,B> & val) const
{
return val.first;
}
};

int main()
{
std::map<int, std::string> m;
std::unordered_set<int> r;

// ...

std::copy(boost::make_transform_iterator(m.begin(), get_first{}),
boost::make_transform_iterator(m.end(), get_first{}),
std::inserter(r, r.end()) );
}

拥有一个取消引用元组/对的 Kth 元素的迭代器会更具表现力,但 transform_iterator 可以很好地完成这项工作。

关于c++ - 如何使用 C++11 中的函数式编程从 map 中获取键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27010430/

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