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

时间:2013-06-13 11:00:39

标签: c++ c++11 vector lambda initialization

有没有办法使用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;
                }
            });
        });
    });

}

非常感谢任何帮助或想法!

3 个答案:

答案 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的最佳方法intrand() % 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;
        }
    }
}