我需要编写一个小函数,使一个新的std :: set从现有的元素中获取最后n个元素。
以下是代码:
template <typename S, typename T, typename Z>
std::set<T,S,Z> get_first_subset(std::set<T,S,Z> const& set, size_t size) {
if (size == 0)
return std::set<T,S,Z>();
typename std::set<T,S,Z>::reverse_iterator j = set.rbegin();
std::advance(j, size - 1);
return std::set<T,S,Z> ((++j).base(), set.end());
}
它有效,但是因为我不需要访问类型T,S和Z我想知道是否有一种方法可以简单地说“任何std :: set”而没有三个模板参数。
答案 0 :(得分:1)
如何让它更通用:
#include <iterator>
template <typename T>
T get_first_subset(T const& set, size_t size) {
if (size == 0)
return T();
typename T::reverse_iterator j = set.rbegin();
std::advance(j, size - 1);
return T ((++j).base(), set.end());
}
然后:
int main() {
std::set<int> s{10, 2,4,6,7,8,9}, s1;
s1 = get_first_subset(s, 4);
for (auto i:s1) std::cout << i << " ";
std::cout << std::endl;
}
输出:
7 8 9 10
您还可以使用可变参数模板(C ++ 11),大括号初始化和auto
关键字来避免重复:
template <typename ...S>
std::set<S...> get_first_subset(std::set<S...> const& set, size_t size) {
if (size == 0) return {};
auto j = set.rbegin();
std::advance(j, size - 1);
return {(++j).base(), set.end()};
}