gpt4 book ai didi

c++ - C++17 中的 constexpr 容器是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:01 33 4
gpt4 key购买 nike

我想创建一个类,其中包含类似 std::map 的方法,但它应该在编译时进行排序。哪个constexpr容器适合存储 key template<class K>和值(value)观 template<class V>

std::vector 不满足这些要求。

UPD:我们发现 std::array有很多 constexpr 方法。我的问题使用 std::array<std::pair<K, V> > 就足够了.但问题仍然存在。

最佳答案

大多数 C++ 标准库容器并不像 constexpr 那样有用。 AFAIK 只有前 64 位的 std::bitsetstd::array(任意长度)是可填充的编译时间。

在程序本身准备就绪之前,不要专注于此类性能优化。在 C++11 中使用可变参数模板函数填充大型 std::array 编译时并不太难。

如何使用可变参数模板在编译时填充 4 个整数数组(每个整数代表 6 种颜色中的一种)的示例:

constexpr int ColorCount = 6;
constexpr int PositionCount = 4;

using Positions = std::array<int, PositionCount>;

template <int N>
struct PositionsFiller
{
template <typename T, typename ...Tn>
static constexpr Positions fill(T packed, Tn ...rest)
{
return PositionsFiller<N - 1>::fill(packed / ColorCount, packed % ColorCount, rest...);
}
};

template <>
struct PositionsFiller<1>
{
template <typename T, typename ...Tn>
static constexpr Positions fill(T last, Tn ...rest)
{
return Positions{last, rest...};
}
};

constexpr Positions pos666(PositionsFiller<PositionCount>::fill(666));

在 C++17 中,同样可以用简单的循环来完成,因为对 constexpr 的要求放宽了,并且不需要可变参数模板:

constexpr int ColorCount = 6;
constexpr int PositionCount = 4;

using Positions = std::array<int, PositionCount>;

static constexpr Positions fillPositions(int packed)
{
Positions ret{};
for (Positions::size_type i = ret.size(); i > 0; --i)
{
ret[i-1] = packed % ColorCount;
packed /= ColorCount;
}
return ret;
}

constexpr Positions pos666(fillPositions(666));

请注意,在编译时进行复杂的准备工作会减慢编译速度。当模块仍在开发中时,这可能很烦人。更好的办法是在程序开始时填充通常的可变数组,然后用编译时填充等优化来替换它。

关于c++ - C++17 中的 constexpr 容器是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49352875/

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