在C ++ 11中,
vector<string> blockPathList;
for(int i = 0; i < blockNum; i++)
{
blockPathList.push_back(desPath + "part" + to_string(i));
}
是否有可能重写上面的代码,如列表理解,或更短,更简洁?
在C ++ 11中,
vector<string> blockPathList;
for(int i = 0; i < blockNum; i++)
{
blockPathList.push_back(desPath + "part" + to_string(i));
}
是否有可能重写上面的代码,如列表理解,或更短,更简洁?
您想使用第三方库吗? Eric Niebler's 范围-V3 允许:
std::vector<string> blockPathList =
view::ints(0, blockNum)
| view::transform([&desPath](int i) {
return desPath + "part" + std::to_string(i);
});
这就像你将要用C ++获得的功能列表理解一样。
也不漂亮,但也应该完成工作:
int cur = 0;
std::vector<std::string> blockPathList(blockNum);
std::generate(blockPathList.begin(), blockPathList.end(),
[&](){ return destPath + "part" + std::to_string(cur++); });
不幸的是
std::generate
Generator
不接受任何争论。你也可以使用 std::for_each
:
std::vector<int> nums(blockNum);
std::iota(nums.begin(), nums.end(), 0);
std::for_each(nums.begin(), nums.end(), [&](int c) {
blockPathList.push_back(destPath + "part" + std::to_string(c));
});
但这再次被证实是因为 std::iota
不生成范围。它使用迭代器填充现有范围,而不是在其自身中充当数字迭代器(当然,您可以通过实现或使用生成这些迭代器的东西来解决这个问题)