获取std :: list的前N个元素?

Use*_*ser 1 c++ stdlist visual-c++-2010

如果N> =列表大小(并处理N = 0),获取作为std :: list的前N个元素或整个列表的新列表的正确和安全的方法是什么?

更新

实际上我不一定需要新的列表,我只想在后续代码中对列表的子集进行操作.我假设创建一个新列表是一种合理的方法(注意列表大小通常低于50).

Dav*_*vid 7

std::list<int> a;
size_t n = 13;
auto end = std::next(a.begin(), std::min(n, a.size()));
Run Code Online (Sandbox Code Playgroud)

创建一个包含第一个列表的前n个元素的新列表:

std::list<int> b(a.begin(), end);
Run Code Online (Sandbox Code Playgroud)

或者填充现有列表:

std::list<int> b;
std::copy(a.begin(), end, std::back_inserter(b));
Run Code Online (Sandbox Code Playgroud)

  • 我看了,我不认为`std :: advance`会照顾到结束.至少标准只是让它在推进迭代器.它没有提到检查. (2认同)
  • 你为什么用`operator +`代替`std :: next`来解决你的代码呢? (2认同)

eca*_*mur 6

template<typename T>
std::list<T> first_n(const std::list<T> &in, std::size_t n) {
    return std::list<T> out{in.begin(),
      std::next(in.begin(), std::min(in.size(), n))};
}
Run Code Online (Sandbox Code Playgroud)