首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么flat_set和flat_map不是ContiguousRange?

为什么flat_set和flat_map不是ContiguousRange?
EN

Stack Overflow用户
提问于 2019-10-09 09:03:13
回答 1查看 185关注 0票数 4

它是故意的(缺乏data()成员函数)吗?它防止了从flat_set/flat_mapstd::span的衰变,如果我们将flat_set/flat_map作为排序vector处理,这是非常有用的。

做这样的事安全吗?

代码语言:javascript
复制
template<typename T>
std::span<const T> make_span(const std::flat_set<T>& fset)
{
    return std::span<const T>{fset.empty() ? nullptr : std::addressof(*fset.begin()),
                              fset.size()};
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-09 09:22:11

std::flat_set应该是一个容器适配器(比如std::queuestd::stack),并且应该专门使用支持随机访问迭代的容器后端,比如std::vectorstd::deque。来自P1222 ( std::flat_set提案):

任何支持随机访问迭代的序列容器都可以用来实例化flat_set。在partic中,可以使用vectordeque .

不施加任何要求。存储的任何连续性,std::deque实际上没有一个data()函数,也没有将其元素存储在一个连续的范围内。这意味着:

  1. 是的,这是故意的。由于std::flat_set应该是一个适配器,所以可以将对可能的底层连续范围的访问委托给后端,并且对std::flat_set的需求可以更加灵活。
  2. 您的make_span模板应该是安全的,因为它只接受默认底层容器std::vectorstd::flat_set实例。不过,我认为这有点危险--当std::flat_set<T, std::deque<T>>编译失败时,可能有人会尝试添加第二个模板参数std::flat_set<T, Container<T>>,并在访问第一个底层std::deque桶之外的元素时遇到UB。

还请注意,std::flat_map在其当前形式中使用两个单独的容器作为密钥和值存储,以提高缓存的局部性,同时搜索匹配的密钥。即使std::flat_map需要一个连续的后端,这也不能与有意义的std::flat_map::data()访问函数一起进行。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58300580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档