C ++为所有std :: sets编写泛型函数

时间:2014-03-04 09:47:38

标签: c++ templates stdset

我需要编写一个小函数,使一个新的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”而没有三个模板参数。

1 个答案:

答案 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()};
}