繁体   English   中英

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

[英]How to use algorithms to fill vector of vectors

我有

typedef std::vector<int> IVec;
typedef std::vector<IVec> IMat;

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

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;
        }
    }
}

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

最好的解决方案是您已经实施的解决方案。 它利用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; });

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

for(auto i = 0U;i < mat.size();i++) for(auto j = 0U;j < mat[i].size();j++) mat[i][j] = i*j;

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

我不知道这是否比双循环更好,但是在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;});

现场演示

我想我会进一步评论Jonathan的优秀答案。

暂时忽略c ++ 11语法并想象我们已经编写了一些支持类(现在无关紧要)。

我们可以想象出这样的代码:

auto main() -> int
{
    // define a matrix (vector of vectors)
    IMat mat;

    // resize it through some previously defined function
    resize(mat, 10, 10);

    // get an object that is a pseudo-container representing its extent
    auto extent = extent_of(mat);

    // generate values in the pseudo-container which forwards to the matrix
    std::generate(extent.begin(), 
                  extent.end(), 
                  [](auto pxy) { pxy.set_value(pxy.x * pxy.y); });

    // or even

    for (auto pxy : extent_of(mat)) {
        pxy.set_value(product(pxy.coordinates()));
    }

    return 0;
}

之后有100行支持代码(可迭代容器及其代理并不简单),这将编译和工作。

毫无疑问它会很聪明,但有一些问题:

  • 100个额外的代码行是小问题。
  • 在我看来,这个代码实际上是比你少的表现 也就是说,你的代码正在做什么。 有了我的,你必须做出一些假设,或者去了解额外的100行代码。
  • 我的代码需要比你多很多保养(和文档)

有时少即是多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM