它是故意的(缺乏data()成员函数)吗?它防止了从flat_set/flat_map到std::span的衰变,如果我们将flat_set/flat_map作为排序vector处理,这是非常有用的。
做这样的事安全吗?
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()};
}发布于 2019-10-09 09:22:11
std::flat_set应该是一个容器适配器(比如std::queue或std::stack),并且应该专门使用支持随机访问迭代的容器后端,比如std::vector和std::deque。来自P1222 ( std::flat_set提案):
任何支持随机访问迭代的序列容器都可以用来实例化
flat_set。在partic中,可以使用vector和deque.
不施加任何要求。存储的任何连续性,std::deque实际上没有一个data()函数,也没有将其元素存储在一个连续的范围内。这意味着:
std::flat_set应该是一个适配器,所以可以将对可能的底层连续范围的访问委托给后端,并且对std::flat_set的需求可以更加灵活。make_span模板应该是安全的,因为它只接受默认底层容器std::vector的std::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()访问函数一起进行。
https://stackoverflow.com/questions/58300580
复制相似问题