如何通过带有索引增量的generate_n填充STL容器

ore*_*uro 5 c++ lambda stl

要使用依赖于索引的值填充STL容器,我通常会像下面的代码一样编写.在没有声明索引的情况下有没有办法做同样的事情?

int main(){
  static int N=10;
  auto func = [](int idx){return idx*(idx+1)+1;};
  int idx = -1;
  std::list<int> lst;
  std::generate_n(std::back_inserter(lst), N, [&](){idx++; return func(idx);});
}
Run Code Online (Sandbox Code Playgroud)

lub*_*bgr 5

您可以将索引移动到lambda捕获并使lambda像这样可变(需要C++ 14):

std::generate_n(std::back_inserter(lst), N,
    [&func, idx = -1] () mutable {idx++; return func(idx);});
Run Code Online (Sandbox Code Playgroud)

现在你可以省略该行int idx = -1;.可能有一个更好的解决方案,因为牺牲闭包的默认const限定只是为了将一个整数声明从周围的范围移动到捕获中并不完美.尽管如此,范围idx已经缩小,如果我理解你的问题,这就是目标.