C++ 是否有一种方法可以使用std::fill()函数返回值,并且该函数需要一个等于容器索引的输入?
i、 e ////C++ 是否有一种方法可以使用std::fill()函数返回值,并且该函数需要一个等于容器索引的输入?,c++,stl,C++,Stl,i、 e //// 更新: GenerateSomething(i)实际上是一个返回指针的函数调用,如pObj->GetIt(i)。 通常我只需要一个特定的指针,所以我会像pObj->GetIt(0)那样使用它,但在某些情况下,我需要获取所有指针,以便出现一个循环 std::fill(ToBeFilled, ToBeFilled + sizeof(ToBeFilled), GenerateSomething(/*How to do?*/)); 因Mark B的评论而编辑。使用generate(
更新:
GenerateSomething(i)
实际上是一个返回指针的函数调用,如pObj->GetIt(i)
。
通常我只需要一个特定的指针,所以我会像pObj->GetIt(0)
那样使用它,但在某些情况下,我需要获取所有指针,以便出现一个循环
std::fill(ToBeFilled, ToBeFilled + sizeof(ToBeFilled), GenerateSomething(/*How to do?*/));
因Mark B的评论而编辑。使用generate
(由我编写)版本进行测试,该版本确实为每次迭代制作了函数对象的副本:
struct Filler {
int real_;
int &index_;
Filler() : real_(0), index_(real_) {}
int operator()() {
return GenerateSomething(index_++);
}
};
std::generate(ToBeFilled, ToBeFilled + 10, Filler());
模板
void generate(开始、结束、F func)
{
对于(;开始!=完成;++开始)
{
F生成器=func;
*启动=发电机();
}
}
另一种略有不同(仅限C++11)的方法:
template <typename It, typename F>
void generate(It start, It finish, F func)
{
for(;start != finish;++start)
{
F generator = func;
*start = generator();
}
}
如果您处理大量数据,这可能会有问题(这相当于缓存不友好),但对于您正在处理的这么小的容器,这根本不是问题
编辑:当然,如果您想避免这种情况,您可以编写一个包含函子的iota(就像他们可能应该包含在标准中一样):
首先是一个小标题,我称之为“numericx”:
好奇,你为什么需要索引?你是否从一个容器映射到另一个容器?我将编辑我的帖子以获取更多信息。实际上,它是一个对象的函数调用,它返回一个指针。比如说它就像
pObj->Get(i)
,但是我得到了所有i
,这个循环可能比任何功能替代品都更干净,尽管Boost.Range可能会简化它一点。哦,这也非常优雅。可悲的是,我以前见过这种情况。可悲的是,我根本没有想到这一点。字面上的描述是“我需要一个存储状态的函数”。函子是一个完美的匹配。如果你有C++11,就有std::iota
。@blastfurny:不幸的是,std::iota
本身不能完成这项工作——它只分配连续的值,而不是对值执行函数的结果。但它仍然可以是解决方案的一部分(我在回答中使用了它)。@anthony arnold:不一定。例如,它可以在每次迭代时将原始参数复制到临时参数,然后调用该临时参数。然后将0
作为参数传递给GenerateSomething
时的每个调用。
template <typename It, typename F>
void generate(It start, It finish, F func)
{
for(;start != finish;++start)
{
F generator = func;
*start = generator();
}
}
using std::begin;
using std::end;
std::iota(begin(toBeFilled), end(toBeFilled), 0);
std::transform(begin(toBeFilled), end(toBeFilled),
begin(toBeFilled), GenerateSomething);
#ifndef NUMERICX_H_INC_
#define NUMERICX_H_INC_
namespace stdx {
template <class FwdIter, class T, class Func>
void iota(FwdIter b, FwdIter e, T start_val, Func f) {
while (b != e)
*b++ = f(start_val++);
}
}
#endif
#include "numericx"
stdx::iota(begin(toBeFilled), end(toBeFilled), 0, GenerateSomething);