输出向量行

时间:2018-12-31 16:46:57

标签: c++ loops vector

此内容已被省略。不遵守规则。

2 个答案:

答案 0 :(得分:0)

  

输入一维矢量

但是

int rowlength = std::sqrt(in.size());

代码行似乎假设输入实际上是一个方形二维矩阵(即行和列的数目相同),那是什么?如果in向量中的元素数不是一个完美的正方形怎么办?

关于输入的这种混淆很可能会引起您的问题,应先解决该问题,然后再执行其他操作。

答案 1 :(得分:0)

我认为您想要做的是以下事情:

void get_row(int r, const std::vector<int>& in, std::vector<int>& out) {

    int rowlength = std::sqrt(in.size());
    std::vector<std::vector<int>> temp; // now a 2D vector (vector of vectors)

    for(int i = 0; i < rowlength; i++) {
        temp.emplace_back();    // for each row, we need to emplace it
        for(int j = 0; j < rowlength; j++) {
            // we need to copy every value to the i-th row
            temp[i].push_back(in[twod_to_oned(i, j, rowlength)]);
        }
    }

    for(int j = 0; j < rowlength; j++) {
        // we copy the r-th row to out
        out.push_back(temp[r][j]);
    }
}

您的解决方案使用std::vector<int>而不是std::vector<std::vector<int>>。前者不支持通过[][]语法访问元素。

您还正在将该向量分配到其边界之外。这导致不确定的行为。始终使用push_backemplate_back添加元素。仅使用operator []访问当前数据。

最后,将行插入out向量也是如此。只有您知道out向量是否包含足够的元素。我的解决方案假定out为空,因此我们需要push_back整行。

此外:您可能希望使用std::vector::insert而不是手动的for()循环。考虑将第三个循环替换为:

out.insert(out.end(), temp[r].begin(), temp[r].end());

可能更有效,更易读。第一个循环的内部for()外观也可以用这种方式替换(甚至更好-可以使用从in向量获得的迭代器放置向量)。我强烈建议您尝试实现这一目标。