用C++做两次事的成语

And*_*eas 5 c++ idioms

两次做某事有一个共同的习惯用法,如下列情况?

    for ( int i = 0; i < num_pairs; i++ ) {
        cards.push_back( Card(i) );
        cards.push_back( Card(i) );
    }
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,比引入一个从0到1计数的新循环变量有一个更清晰的方法,特别是因为除了计数之外它没有被使用.

    for ( int i = 0; i < num_pairs; i++ )
        for ( int j = 0; j < 2; j++ )
            cards.push_back( Card(i) );
Run Code Online (Sandbox Code Playgroud)

(Card只是我编写的一些课程,与问题无关.)

Col*_*nee 10

您可能想要使用该fill_n功能<algorithm>

for ( int i = 0; i < num_pairs; i++ )
    std::fill_n(std::back_inserter(cards), 2, Card(i));
Run Code Online (Sandbox Code Playgroud)

  • @Andreas它会调用Card(int)(或任何签名),它可能会两次调用复制构造函数. (2认同)

rek*_*127 6

就个人而言,我会留下它是怎么回事.它看起来干净,易于理解,而且非常易读.只需留下评论,提及你为什么要两次这样做(但无论如何都会这样做).


seh*_*ehe 5

我有一些建议.看到我的推荐的最后一个:

  1. 在我看来节拍:insert(it, N, value)std::fill_n

    for ( int i = 0; i < num_pairs; i++ ) {
        cards.insert(cards.end(), 2, Card(i) );
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果顺序并不重要,你可以只生成卡一次,复制的事实

    std::copy(cards.begin(), cards.end(), std::back_inserter(cards));
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用脏lambda和整数除法技巧.警告这有一个过早优化的标志:没有充分理由降低可读性.

    std::vector<Card> cards(num_pairs * 2);
    int i = 0;
    std::generate_n(cards.begin(), num_pairs, [&i] () { return Card(i++/2); });
    
    Run Code Online (Sandbox Code Playgroud)

    (假设Card默认构造的.如果没有,请使用cards.back_inserter())

  4. 我的推荐

    在性能和意图表达方面取得以下成绩:

    std::vector<Card> cards;
    cards.reserve(num_pairs*2);
    for (int i = 0; i < num_pairs; ++i)
    {
        cards.emplace_back(i);
        cards.emplace_back(i);
    }
    
    Run Code Online (Sandbox Code Playgroud)