所以,我创建了一个这样的矩阵:
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来实现这一点,使这个代码不那么笨重。
所以我要求你帮助用我的输入填充我的矩阵。任何帮助将不胜感激!
感谢。
答案 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";
}
显然,这远非如此。但它做了正确的事。
希望这有帮助。