3

有没有一种方法可以像使用 lambda 函数一样初始化某个容器的所有值std::for_each?我需要一个 3 维std::vector的 random s,如果我可以在构造函数中执行此操作而无需执行另一个循环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;
                }
            });
        });
    });

}

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

4

3 回答 3

3

最内层向量的元素将根据调用 lambda 的结果进行初始化,即rand() % 100. 它们都将被初始化为相同的值,并且无法在每次int需要初始化元素(在您的情况下为 an )时调用 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>

但同样,只有在您迫切希望消除该循环时才考虑这一点。就个人而言,我认为循环的存在更清楚地说明了向量的初始化方式——这意味着它可以更好地传达你的意图。

于 2013-06-13T11:11:52.357 回答
2

感觉像 std::generate/std::generate_n 是你要找的

于 2013-06-13T15:34:12.280 回答
0

由于在 的构造函数中调用 lambdavector会将所有值初始化为相同的数字(如上一个答案中所述),我认为以下是将 s 的 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;
        }
    }
}
于 2013-06-13T12:55:50.910 回答