有没有办法用STL优雅地填充矩阵(向量矢量)?

时间:2016-07-03 17:51:57

标签: c++ matrix vector stl

所以,我创建了一个这样的矩阵:

constexpr size_t row = 3, col = 5;

std::vector<std::vector<int>> matrix(row, std::vector<int>(col));

我正在尝试用用户的输入填充它。这是迄今为止我得到的最佳解决方案:

for (size_t i = 0; i < matrix.size(); i++) 
{

    for (size_t j = 0; j < matrix[i].size(); j++) 
    {
        std::cout << "Matrix[" << i << "][" << j << "] = ";

        std::cin >> matrix[i][j];
    }

    std::cout << "\n";
}

它看起来没问题,工作正常,但必须有一种方法可以使用STL来实现这一点,使这个代码不那么笨重。

所以我要求你帮助用我的输入填充我的矩阵。任何帮助将不胜感激!

感谢。

3 个答案:

答案 0 :(得分:3)

如果你所追求的只是美化它......那么你可以做类似的事情:

  constexpr size_t row = 3, col = 5;
  constexpr size_t total = row * col;
  std::vector<std::vector<int>> matrix(row, std::vector<int>(col));

  int j = -1;
  for (int i = 0; i < total; i++) {
    std::cin >> matrix[(i % col) ? j : ++j][i % col];
  }

使用C ++ 14:

std::for_each(std::begin(matrix), std::end(matrix), [](auto& v) mutable{
        for (auto& e : v) std::cin >> e;
});

您也可以使用c ++ 11执行上述操作,而不使用lambda的auto类型推导。

答案 1 :(得分:0)

您可以尝试使用std :: for_each来缩小代码。这样,您需要定义两个函数(一个用于行,一个用于列)来初始化矩阵。

答案 2 :(得分:0)

用户输入绝不容易
有很多可能出错的地方,你必须小心处理它。

最终目标应该是为最终用户提供合理的输入,而不一定是“漂亮”。

例如:

#include <algorithm>
#include <cctype>
#include <iostream>
#include <iterator>
#include <vector>
#include <sstream>
#include <string>

struct matrix: public std::vector<std::vector<int>> { };

std::istream& operator >> (std::istream& ins, matrix& m)
{
  std::string s;
  std::size_t cols = 0;

  // while input and not a blank line
  while (std::getline(ins, s) and !s.empty())
  {
    // scan one row from the input line
    std::istringstream ss{ s };
    std::vector<int> row;
    std::copy(std::istream_iterator<int>(ss), std::istream_iterator<int>(), std::back_inserter(row));

    // make sure that the source input stream fails if the intermediary fails
    if (ss.fail()) 
    {
      ins.setstate(std::ios::failbit);
      return ins;
    }
    m.emplace_back(row);

    // keep track of maximum number of columns
    cols = std::max(cols,row.size());
  }

  // make sure the matrix has the same number of columns in each row
  for (auto& row : m) row.resize(cols);
  return ins;
}

int main()
{
  matrix m;

  std::cout << "Enter the matrix, one row per line.\n"
               "Press Enter twice when done:\n";
  std::cin >> m;

  auto rows = m.size();
  auto cols = m.size() ? m[0].size() : 0;
  std::cout << "Your matrix has " << rows << " rows and " << cols << " columns.\n";
}

显然,这远非如此。但它做了正确的事。

希望这有帮助。