在我的任务:)尽可能多地使用STL我想知道是否可以使用std :: generate和std :: back_inserter组合,以便我可以执行与以下代码相同的操作:
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);});
它似乎工作正常,但我想确保我没有弄乱一些东西.
解决方法
generate_n
要求其第一个参数满足
OutputIterator
,back_insert_iterator
(其iterator_category为
output_iterator_tag
).
您的代码可能存在的问题:
std::generate_n(std::back_inserter(mrbig),[](){return 'a'+(rand()%26);});
>调用mrbig.reserve(nitems)会更有效率
>您应该使用< random>中的c++03 std :: rand或c++11 uniform_int_distribution<>
.而不是c兰特.
> lambda捕获和lambda体之间的括号()对于不带参数的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?