在我的追求中:)尽可能多地使用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),nitems,[](){return 'a'+(rand()%26);});
mrbig.reserve(nitems)
会更有效率。std::rand
中的 c++03
uniform_int_distribution<>
或 c++11<random>
而不是 c rand
。()
是不必要的,尽管有些人更喜欢它们。a-z
形成连续的块;例如,在 EBCDIC 中,i
和 j
不相邻。我相信唯一可移植的形式是在程序中存储一个字符串 "abcd...xyz"
并对其进行索引:如何在 C 中编写从 a 到 z 和 A 到 Z 运行的单个 for 循环?