如何用索引增量generate_n填充STL容器
How to fill STL containers by means of generate_n with index increment
要用依赖于其索引的值填充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);});
}
您可以将索引移动到lambda捕获中,并使lambda像这样可变(需要C++14(:
std::generate_n(std::back_inserter(lst), N,
[&func, idx = -1] () mutable {idx++; return func(idx);});
现在可以省略int idx = -1;
行。不过,可能还有更好的解决方案,因为仅仅为了将整数声明从周围的范围移动到捕获中而牺牲闭包的默认const限定并不是完美的。尽管如此,idx
的范围已经缩小,如果我正确理解你的问题,这就是目标。
性能方面,这看起来相当于:
#include <list>
#include <algorithm>
int main()
{
std::list<int> lst;
std::generate_n(std::back_inserter(lst), 10, [&](){auto idx = lst.size(); return idx*(idx+1)+1;});
}
如果你可以使用boost,那么就可以了
#include <algorithm>
#include <list>
#include <boost/iterator/counting_iterator.hpp>
int main()
{
static int N = 10;
std::list<int> lst;
std::transform(boost::counting_iterator<int>(0), boost::counting_iterator<int>(N), std::back_inserter(lst), func);
}
您可以在lambda函数中使用静态变量。我认为,如果您的列表大小很大,这比每次在lambda内部调用列表大小函数要好。
#include <iostream>
#include <algorithm>
#include <list>
int main()
{
static int N = 10;
std::list<int> lst;
std::generate_n(std::back_inserter(lst),
N, [&](){
static int idx = -1;
++idx;
return idx*(idx+1)+1;
});
for(auto e : lst)
std::cout << e << " ";
}
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 在c++中用vector填充一个简单的动态数组
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 如何使用用户输入在C++中正确填充2D数组
- 如何找到大小'x'数组是否完全填充,在C++?
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 通过for循环使用用户输入填充列表
- 在STL容器中使用模板类
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 将stl字符串缩小到小于15个字符的容量
- 如何用索引增量generate_n填充STL容器
- 使用.txt文件填充 STL 列表不起作用
- 使用队列和列表 STL 进行C++分配。在将数据填充到列表或队列中然后打印该数据时遇到问题
- 如何在没有STL的情况下从2d阵列中删除任何未填充的插槽
- STL填充和前向迭代器
- 使用 STL 从<T> map<T,Z> 的键填充矢量
- 什么是c#等效于c++ STL填充方法
- 是否有一种方法来填充矩阵(向量的向量)优雅地使用STL