1

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

4

1 回答 1

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()};
}
于 2014-03-04T09:53:08.130 回答