这是组合std::generate_n和std::back_inserter的正确方法吗

Is this correct way to combine std::generate_n and std::back_inserter?

本文关键字:std inserter 方法 组合 generate back      更新时间:2023-10-16

为了尽可能多地使用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_categoryoutput_iterator_tag)。

代码的潜在问题:

std::generate_n(std::back_inserter(mrbig),nitems,[](){return 'a'+(rand()%26);});
  • 调用mrbig.reserve(nitems)会更有效率
  • 您应该使用<random>中的c++03 std::rand或c++11 uniform_int_distribution<>,而不是c rand
  • lambda捕获和lambda主体之间的括号()对于不带参数的lambda来说是不必要的,尽管有些人更喜欢它们
  • 不能保证在实现字符集中字母a-z形成连续块;例如,在EBCDIC中,ij不相邻。我相信唯一可移植的形式是在程序中存储一个字符串"abcd...xyz"并对其进行索引:我如何在C中编写一个从a到z和从a到z的for循环