3

IE

int ToBeFilled[10];
int GenerateSomething(int x);
for(int i = 0; i < 10; ++i) ToBeFilled[i] = GenerateSomething(i);

如何使用 std::fill() 来做到这一点?

std::fill(ToBeFilled, ToBeFilled + sizeof(ToBeFilled), GenerateSomething(/*How to do?*/));

////
更新:

GenerateSomething(i)实际上是一个返回指针的函数调用,例如pObj->GetIt(i). 通常我只需要一个特定的指针,所以我会像使用它一样使用它pObj->GetIt(0),但在某些情况下我需要获取所有指针,这样就会出现一个循环。

4

2 回答 2

4

还有另一种稍有不同(仅限 C++11)的方法:

using std::begin;
using std::end;

std::iota(begin(toBeFilled), end(toBeFilled), 0);

std::transform(begin(toBeFilled), end(toBeFilled), 
               begin(toBeFilled), GenerateSomething);

如果您正在处理大量数据,这可能会出现问题(它对缓存不友好),但是对于您正在处理的小容器,这根本不是问题。

编辑:当然,如果你想避免这种情况,你可以写一个带有仿函数的iota(就像它们可能应该包含在标准中一样):

首先是一个小标题,我称之为“numericx”:

#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

[请注意,对于非平凡的迭代器和/或 T,在单独的语句中用前增量替换后增量可能会更好]。

然后使用它的(现在微不足道的)代码:

#include "numericx"

stdx::iota(begin(toBeFilled), end(toBeFilled), 0, GenerateSomething);
于 2012-06-15T03:55:53.057 回答
2
struct Filler {
    int real_;
    int &index_;
    Filler() : real_(0), index_(real_) {}

    int operator()() {
        return GenerateSomething(index_++);
    }
};

std::generate(ToBeFilled, ToBeFilled + 10, Filler());

由于 Mark B 的评论而编辑。generate使用(由我编写)的版本进行测试,该版本确实为每次迭代制作了函数对象的副本:

template <typename It, typename F>
void generate(It start, It finish, F func)
{
   for(;start != finish;++start)
   {
      F generator = func;
      *start = generator();
   }
}
于 2012-06-15T03:23:30.207 回答