Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有一种方法可以使用std::fill()函数返回值,并且该函数需要一个等于容器索引的输入?_C++_Stl - Fatal编程技术网

C++ 是否有一种方法可以使用std::fill()函数返回值,并且该函数需要一个等于容器索引的输入?

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(

i、 e

////
更新:

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);