C++ 在C+中使用STL生成成对项的向量+;

C++ 在C+中使用STL生成成对项的向量+;,c++,stl,C++,Stl,我想使用STLgenerate函数生成一个{I,0}对向量,从0到n-1,当前代码如下所示 std::vector<std::pair<int, int>> new_vertex(n); int i = -1; std::generate(new_vertex.begin(), new_vertex.end(), [&]{ i += 1; return {i, 0}; }); std::向量新_顶点(n); int i=-1; std::gene

我想使用STL
generate
函数生成一个
{I,0}
对向量,从0到n-1,当前代码如下所示

std::vector<std::pair<int, int>> new_vertex(n);    
int i = -1;
std::generate(new_vertex.begin(), new_vertex.end(), [&]{
  i += 1;
  return {i, 0};
});
std::向量新_顶点(n);
int i=-1;
std::generate(new_vertex.begin(),new_vertex.end(),[&]{
i+=1;
返回{i,0};
});

我的问题是,有没有更好/更酷的方法来使用STL函数来实现这一点,比如以某种更巧妙的方式使用
transform
,最好是不使用变量声明
inti=-1
。我会让柜台对兰姆达保密。我也不会不必要地初始化向量元素:

#include <algorithm>
#include <iterator>

v.reserve(n);

std::generate_n(std::back_inserter(v), n,
                [i = 0]() mutable { return std::make_pair(i++, 0); });
#包括
#包括
v、 储备(n);
std::generate_n(std::back_inserter(v),n,
[i=0]()可变{return std::make_pair(i++,0);});

在C++14中。我会让柜台对兰姆达保密。我也不会不必要地初始化向量元素:

#include <algorithm>
#include <iterator>

v.reserve(n);

std::generate_n(std::back_inserter(v), n,
                [i = 0]() mutable { return std::make_pair(i++, 0); });
#包括
#包括
v、 储备(n);
std::generate_n(std::back_inserter(v),n,
[i=0]()可变{return std::make_pair(i++,0);});

有了Eric的,它最终应该会进入标准,你可以生成一个0,1,2,…,的无限列表,然后将它们转换成{0,0},{1,0},{2,0},…,然后取前n个,甚至保持原样,让使用它的任何东西都取下它需要的东西。我认为这是一个好的解决方案。使用需要
N
迭代,也需要迭代。所以从性能的角度来看,这是一样的。是的,但我怀疑是否有人会认可这是一个好的编程实践。想想看,我可以在任何地方定义
I
,它可以用20种不同的方式进行操作。在执行
generate
之前。我的基本问题是,鉴于C++标准的巨大规模,有没有比这更好/更安全的方法?@苏亚什:看看lambda表达式;但是您仍然必须在周围的范围内声明计数器。使用
generate
并不是严格的要求。对于Eric's,它最终应该会进入标准,您可以生成一个0,1,2,…,的无限列表,然后将其转换为{0,0},{1,0},{2,0},…,然后取前n个,或者让它保持原样,让任何使用它的东西得到它需要的东西。我认为这是一个很好的解决方案。使用需要
N
迭代,也需要迭代。所以从性能的角度来看,这是一样的。是的,但我怀疑是否有人会认可这是一个好的编程实践。想想看,我可以在任何地方定义
I
,它可以用20种不同的方式进行操作。在执行
generate
之前。我的基本问题是,鉴于C++标准的巨大规模,有没有比这更好/更安全的方法?@苏亚什:看看lambda表达式;但是您仍然必须在周围范围内声明计数器。使用
generate
并不是严格的要求