在我的任务中:)尽可能多地使用STL我想知道是否可以使用std :: generate和std :: back_inserter组合,以便我可以执行与以下代码相同的操作: / p>
static const size_t nitems=1024*1024;
std::string mrbig;
for (size_t pos=0; pos<nitems; ++pos)
mrbig.push_back('a'+ (rand()%26));
我试过
std::generate_n(std::back_inserter(mrbig),nitems,[](){return 'a'+(rand()%26);});
它似乎工作正常,但我想确保我没有弄乱一些东西。
答案 0 :(得分:10)
generate_n
要求其第一个参数满足OutputIterator
,back_insert_iterator
执行(iterator_category
为output_iterator_tag
)。
您的代码存在潜在问题:
std::generate_n(std::back_inserter(mrbig),nitems,[](){return 'a'+(rand()%26);});
mrbig.reserve(nitems)
会更有效率std::rand
中的c++03 <random>
或c++11 uniform_int_distribution<>
代替c rand
。()
对于没有参数的lambda是不必要的,尽管有些人更喜欢它们a-z
形成一个连续的块;例如,in EBCDIC, i
and j
are not adjacent。我相信唯一可移植的表单是在程序中存储字符串"abcd...xyz"
并将其编入索引:How can I write a single for loop running from a to z and A to Z in C?