我想使用<algorithm>
中的非变异算法,并对编译时已知的一组值提高范围算法。我想知道哪种方法最有效(就性能和内存而言),不包括切换案例方法。
让我们考虑带有一些值的enum(是否为class)。
enum Enum
{
One,
Two,
Three
};
让我们考虑平凡函数bool isOneOrTwo(Enum e)
。
我知道使用<algorithm>
方法可以用两种方法来编写:
1. std::initializer_list<T>
bool isOneOrTwo(Enum e)
{
constexpr std::initializer<Enum> oneAndTwo{One, Two};
return std::any_of(std::begin(oneAndTwo),
std::end(oneAndTwo),
[e](auto i){return e == i;});
}
2。 std::array<T,N>
我们有make_pair
和make_tuple
,但不幸的是我们没有make_array<T>(T&&..)
函数,所以我写了一个:
template<typename... T>
constexpr auto make_array(T&&... args)
{
return std::array<typename std::common_type<T...>::type, sizeof...(T)>{{std::forward<T>(args)...}};
}
然后可以通过以下方式进行功能:
bool isOneOrTwo(Enum e)
{
constexpr auto oneAndTwo = make_array(One, Two);
return std::any_of(std::begin(oneAndTwo),
std::end(oneAndTwo),
[e](auto i){return e == i;});
}
哪个更好(std::initializer_list<T>
或std::array<T,N>
),或者还有其他方法可以使它更快/更便宜?
如果我将std::any_of(begin_it, end_it, lambda)
更改为boost::algorithm::any_of_equal(make_iterator_range(begin_it, end_it), value)
会产生什么影响吗?