两次做某事有一个共同的习惯用法,如下列情况?
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)
我有一些建议.看到我的推荐的最后一个:
在我看来节拍: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)如果顺序并不重要,你可以只生成卡一次,复制后的事实
std::copy(cards.begin(), cards.end(), std::back_inserter(cards));
Run Code Online (Sandbox Code Playgroud)使用脏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())
在性能和意图表达方面取得以下成绩:
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)