是否可以在向量的构造函数中使用 lambda 函数?
Is it possible to use a lambda function inside of a vector's constructor?
是否有一种方法来初始化一些使用lambda函数的容器的所有值,就像使用std::for_each
一样?我需要一个随机int
s的三维std::vector
,如果我能在构造函数中做到这一点,而不必做另一个std::for_each
循环,那就太好了。
我已经尝试了以下操作,但没有成功:
#include <iostream> /* std::cout */
#include <vector> /* std::vector */
#include <algorithm> /* std::for_each */
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
int main(){
srand(time(nullptr));
/* only initializes first element, count[0][0][0] */
std::vector<std::vector<std::vector<int>>> count{100,
std::vector<std::vector<int>>{100,
std::vector<int>{100,
[](){
return = rand() % 100;
}()
}
}
};
int temp = 0;
/* here is how I access all elements using std::for_each and lambdas */
std::for_each(std::begin(count), std::end(count),
[&temp](std::vector<std::vector<int>> i){
std::for_each(std::begin(i), std::end(i), [&temp](std::vector<int> j){
std::for_each(std::begin(j), std::end(j), [&temp](int k) {
if(k > temp){
temp = k;
}
});
});
});
}
任何帮助或想法都非常感谢! 最内层向量的元素将所有从调用lambda的结果初始化,即rand() % 100
。它们都将被初始化为相同的值,并且无法在每次需要初始化元素(在您的示例中是int
)时调用lambda。
如果你真的,真的想让它透明地发生,你可以创建一个你自己的类型,它的行为完全像int
,但以你想要的方式默认初始化:
struct RandomInitInt
{
RandomInitInt() { i = rand() % 100; }
RandomInitInt(int i) : i(i) { }
operator int () { return i; }
int i;
};
你可以这样使用:
std::vector<std::vector<std::vector<RandomInitInt>>> count(100,
std::vector<std::vector<RandomInitInt>>(100,
std::vector<RandomInitInt>(100)
)
);
将vector<int>
替换为vector<RandomInitInt>
。
但是,只有当你非常想消除这个循环时才考虑这个。就我个人而言,我认为循环的存在更清楚地说明了vector的初始化方式——这意味着它能更好地传达你的意图。
感觉std::generate/std::generate_n是您正在寻找的
由于在vector
的构造函数中调用lambda将所有值初始化为相同的数字(如前面的答案中提到的),我认为以下是将int
s的3D vector
初始化为rand() % 100
的最佳方法:
srand(time(nullptr));
std::vector<std::vector<std::vector<int>>> count{100, std::vector<std::vector<int>>{100, std::vector<int>{100, 0}}};
for(auto& i : count){
for(auto& j : i){
for(auto& k : j){
k = rand() % 100;
}
}
}
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 两组使用lambda函数的大括号
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- C++:Lambda 函数指针转换的用例是什么?
- 将 lambda 函数作为参数传递C++
- 如何将 lambda 函数作为参数发送到另一个函数
- 传递 lambda 函数的权衡是什么?
- 如何使用类模拟 C++11 中的 lambda 函数和闭包?
- 不是 lambda 函数中的常量表达式
- 如何使用可变参数数重载 lambda 函数?
- 如何通过指针传递lambda函数?
- 使用带有 lambda 函数指针的模板
- openmp c++ 中并行块内 lambda 函数的奇怪行为
- C++ 中 Lambda 函数中的溢出
- 将数组传递到 lambda 函数中
- lambda 函数未显示正确的结果