是否有库函数用于根据向量元素的索引初始化向量?
这将缩短以下内容:
#include <vector>
using namespace std;
int main() {
auto square = [] (int n) {return n*n;};
vector<int> v(5, 0);
for (int i = 0; i < 5; i++){
v[i] = square(i);
}
}
想到的方法是将其分为两个步骤。在这种情况下,std::iota
将用输入(0、1、2等(填充矢量。然后std::transform
将对每个元素执行函数square
,并在向量中替换它们。
int main()
{
auto square = [] (int n) {return n*n;};
std::vector<int> v(5, 0);
std::iota(v.begin(), v.end(), 0);
std::transform(v.begin(), v.end(), v.begin(), square);
for (int i : v)
std::cout << i << ' ';
}
输出
0 1 4 9 16
老实说,一旦范围可用,这将是一种更加简洁和精简的东西,C++20工作示例
int main()
{
auto square = [] (int n) {return n*n;};
for (int i : std::views::iota(0, 5) | std::views::transform(square))
std::cout << i << ' ';
}
对于向量,有一种简单的方法可以通过减去指针来计算其索引:
std::for_each(v.begin(),v.end(),
[&v,&square](auto& elem){ elem = square(&elem - &v[0]);});
通过auto& elem
访问向量的原始项,然后通过&elem - &v[0]
计算索引,该索引被传递到square
中。