В C ++ 11
vector<string> blockPathList;
for(int i = 0; i < blockNum; i++)
{
blockPathList.push_back(desPath + "part" + to_string(i));
}
Можно ли переписать приведенный выше код, например, для понимания списка, или более коротким и кратким?
Хотите использовать сторонние библиотеки? Эрик Ниблер Диапазон-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
не генерирует диапазоны. Он заполняет существующий диапазон итератором, а не действует как сам по себе числовой итератор (конечно, вы можете решить это, реализовав или используя что-то, что генерирует эти итераторы)