有没有办法使用lambda函数初始化某个容器的所有值,就像使用std::for_each
一样?我需要一个随机std::vector
的3维int
,如果我可以在构造函数中执行此操作而不必执行另一个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;
}
});
});
});
}
非常感谢任何帮助或想法!
答案 0 :(得分:3)
最内层向量的元素 all 将从调用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>
。
但是,再次,只有在你绝望地消除那个循环时才考虑这个。就个人而言,我认为循环的存在对于矢量初始化的方式更清楚 - 这意味着它更好地传达了你的意图。
答案 1 :(得分:2)
感觉像std :: generate / std :: generate_n就是你要找的东西
答案 2 :(得分:0)
由于在vector
的构造函数中调用lambda会将所有值初始化为相同的数字(如上一个答案所述),我认为以下是初始化3D vector
的最佳方法int
到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;
}
}
}