如何使用算法来填充向量的向量

for*_*818 5 c++ algorithm vector

我有

typedef std::vector<int> IVec;
typedef std::vector<IVec> IMat;
Run Code Online (Sandbox Code Playgroud)

我想知道如何IMat通过使用std算法来填充,即如何使用更少的代码执行以下操作(所有IVecs具有相同的大小)?

void fill(IMat& mat){
    for (int i=0;i<mat.size();i++){
        for (int j=0;j<mat[i].size();j++){
            mat[i][j] = i*j;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

PS:已经有一种用常数填充矩阵的方法可以帮助我.最好使用pre-C++ 11算法.

Jon*_*Mee 5

最好的解决方案是您已经实施的解决方案.它利用i/ j作为偏移和输入来计算算法.

标准算法必须使用元素的迭代器维护计数器.这个数据镜像作为问题的确定标志.但它可以做到,即使在一条线上,如果你想要幻想:

for_each(mat.begin(), mat.end(), [&](auto& i) { static auto row = 0; auto column = 0; generate(i.begin(), i.end(), [&]() { return row * column++; }); ++row; });
Run Code Online (Sandbox Code Playgroud)

但正如所说的那样,它可以做到并不意味着应该这样做.解决这个问题的最佳方法是for-loop.如果这是你的事情,即使在一条线上做也是可能的:

for(auto i = 0U;i < mat.size();i++) for(auto j = 0U;j < mat[i].size();j++) mat[i][j] = i*j;
Run Code Online (Sandbox Code Playgroud)

顺便提一下,我的标准算法在Clang 3.7.0,gcc 5.1和Visual Studio 2015上运行良好.但是之前我使用的transform不是generate.在gcc 5.1和Visual Studio 2015中似乎存在一些实现错误,其中包含lambda范围static变量的捕获.

  • 单独为此声明+1:"但正如所述,因为它可以完成并不意味着它应该完成" (2认同)

101*_*010 3

我不知道这是否比双 for 循环更好,但在 C++11 中使用 STL 实现这一点的一种可能方法是使用两个,for_each如下所示:

int i(0);
std::for_each(mat.begin(), mat.end(),
[&i](IVec &ivec){int j(0); std::for_each(ivec.begin(), ivec.end(), 
                           [&i,&j](auto &k){k = i*j++;}); ++i;});
Run Code Online (Sandbox Code Playgroud)

现场演示

  • 我很确定生成的顺序不能保证=&gt;根据实现,您填充了错误的值。 (2认同)