是否可以在向量的构造函数中使用 lambda 函数?

Is it possible to use a lambda function inside of a vector's constructor?

本文关键字:lambda 函数 构造函数 向量 是否      更新时间:2023-10-16

是否有一种方法来初始化一些使用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;
        }
    }
}