这种使用 std::generate_n 和 std::back_inserter 结合的方式正确吗?

12

在我尽可能使用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);});

它似乎工作正常,但我想确信自己没有弄错什么。


8
我会在代码中添加 mrbig.reserve(nitems); 以避免重新分配内存空间。 - Kerrek SB
3
我认为它应该可以工作,尽管你忘记为std::rand添加限定符。虽然这可能仍可行,但实际上不应该这样做,至少如果您没有包含C++中不应该使用的stdlib.h - Christian Rau
1
@ChristianRau - 是的,它已经被弃用了,这是最初的C++标准中反对C族歧视的结果。即便如此,它也不会消失。 - Pete Becker
1
@PeteBecker 好的,从标准来看,你是对的,虽然已经被弃用,但它确实是C++标准库的一部分,抱歉。也许这只是我的个人观点,将库中的东西(即使是标准库)放入全局命名空间很少是合适的(不反对使用using,但请不要自动添加)。我仍然更喜欢非弃用功能而不是弃用功能,也更喜欢C++而不是C/C++,但这可能又是主观的(并且像我说的那样,弃用并不意味着太多)。所以你得到了你的观点。 - Christian Rau
1
为了让任何人都能明白上述讨论的内容:<stdlib.h>是C语言头文件,也是C++标准的一部分,但是在C++中更推荐使用<cstdlib>,因为它将<stdlib.h>中的名称放置在std命名空间中。所有的C头文件<foo.h>都有一个对应的C++包装器<cfoo> - boycy
显示剩余10条评论
1个回答

14

generate_n 要求它的第一个参数满足 OutputIterator,而 back_insert_iterator 是满足这个条件的(它的 iterator_categoryoutput_iterator_tag)。

你的代码可能存在以下问题:

std::generate_n(std::back_inserter(mrbig),nitems,[](){return 'a'+(rand()%26);});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接