如何生成矢量式列表理解
How to generate vector like list comprehension
在C++11中,
vector<string> blockPathList;
for(int i = 0; i < blockNum; i++)
{
blockPathList.push_back(desPath + "part" + to_string(i));
}
是否可以像列表理解一样重写上面的代码,或者更短更简洁?
是否要使用第三方库?Eric Niebler的测距-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));
});
但是由于CCD_ 4不产生范围,所以这再次被放大。它用迭代器填充现有的范围,而不是本身充当数字迭代器(当然,你可以通过实现或使用生成迭代器的东西来解决这个问题)
另一个例子(c++14):
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
template<typename CONTAINER, typename LAMBDA>
auto comprehension(CONTAINER&& container, LAMBDA&& lambda){
std::vector<decltype(lambda(*container.begin()))> w;
std::transform(container.begin(),container.end(),std::back_inserter(w), lambda);
return w;
}
int main(){
auto&& ints = {1,2,3,4,5};
auto&& squares = comprehension(ints,[](auto i){ return i*i; });
for( auto s : squares){ std::cout << s << ' '; }
std::cout << 'n';
}
输出:
1 4 9 16 25
相关文章:
- C++如何生成std::数组列表
- 根据预定义的值生成字符列表
- 生成包含给定类型的 N 个参数的可变参数列表的最佳方法?
- 如何使用模板生成常规参数列表并将其传递给运行时函数?
- c++17通过生成预先声明的类型列表的笛卡尔乘积来生成std::变体
- 根据模板参数生成不同大小的初始值设定项列表
- 正确的生成文件依赖项列表 (C++)
- CMake 生成不带 glob 的源文件列表
- 使用生成来填充模板类 c++ 中的列表
- 生成模板实例列表并对其调用静态函数
- 使用GCC的C makefile - 从子文件夹列表中生成源文件列表
- 生成对列表
- 在 c++ 中生成字符串到 std::指针列表的映射
- C 生成列表的不同排列
- 如何通过C 从数字列表中以3位数字生成数字
- 成员初始值设定项列表中的递增是否会生成未定义的行为?
- 如何生成宏的所有出现的列表
- 从一系列问题列表中生成输入(x)问题
- 从置换的解析器表达式列表动态生成Spirit解析器表达式(在运行时)
- OpenCV -如何从.ppm文件列表中生成.avi文件