已编辑
由于某种原因,当我在Repl.it上运行此程序时,我得到了一个out_of_range错误
我所要做的就是垂直地迭代一个二维向量,并执行一些其他实现。这是代码:
#include <iostream>
#include <vector>
using namespace std;
void matrixElementsSum(vector<vector<int>> matrix) {
int sum = 0;
int i = 0;
for (int j = 0; j < matrix.at(j).size(); j++)
{
for(i = 0; i<matrix.size(); i++)
{
cout << matrix.at(i).at(j) << " ";
}
cout << endl;
}
}
int main()
{
vector<vector<int>> vect
{
{1, 1, 1, 0},
{0, 5, 0, 1},
{2, 1, 3, 10}
};
cout << matrixElementsSum(vect);
return 0;
}
输出为
1 0 2
1 5 1
1 0 3
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check: __n (which is 3) >= this->size() (which is 3)
通常,这个错误意味着我试图读取超过矢量大小的值,但这里的情况并非如此(至少,我是这么认为的(
很难理解这里出了什么问题。我将感谢的任何帮助
注意:我不想水平迭代
必须交换两个循环中的条件:
void matrixElementsSum(vector<vector<int>> matrix) {
int sum = 0;
int i = 0;
int nRow = matrix.size();
int nCol = matrix[0].size();
for (int j = 0; j < nCol; j++)
{
for (i = 0; i < nRow; i++)
{
cout << matrix[i][j] << " ";
}
cout << endl;
}
}
该代码已更新为更易于解释。要查找列的数量,不需要检查每行中元素的数量(大小(;只有第一排就足够了。当列的数量大于行的数量时,代码就会中断,超过这个数量后,matrix[j]
就不存在了,因为它不是一个方阵,这就是matrix[j].size();
失败的原因。
如果每个向量都有相同的长度,那么只要保存大小就足够了,假设至少有一个元素。
void blabla(vector<vector<int>> matrix) {
if (matrix.size() == 0) return;
const size_t jmax = matrix.front().size();
for (size_t j = 0; j < jmax; j++)
for(size_t i = 0; i < matrix.size(); i++)
cout << matrix.at(i).at(j) << " ";
}
如Daniel Langr的评论所述:
for (int j = 0; j < matrix.at(j).size(); j++)
-你怎么知道matrix
有一个索引为j
的元素?
最好将外循环限制为(之前计算的(最长行的大小,并在尝试访问内循环中的特定元素之前检查该元素是否存在。
#include <algorithm>
#include <iomanip> // std::setw
#include <iostream>
#include <vector>
void matrixElementsSum(std::vector<std::vector<int>> const& matrix, int width)
{ // ^^^^^^
auto const longest_row{
std::max_element( matrix.cbegin(), matrix.cend()
, [](auto const& a, auto const& b) {
return a.size() < b.size();
} )};
auto const max_columns{ longest_row != matrix.cend() ? longest_row->size() : 0 };
for ( size_t col{}; col < max_columns; ++col )
{
for( auto const& row : matrix )
{
if ( col < row.size() )
std::cout << std::setw(width) << row[col];
else
std::cout << std::setw(width) << "";
}
std::cout << 'n';
}
}
int main()
{
std::vector<std::vector<int>> vect{
{1, 1, 1, 0},
{0, 5, 0, 1},
{2, 1, 3, 10}
};
// std::cout << matrixElementsSum(vect);
// ^ It's a function returning void, how could this compile?
matrixElementsSum(vect, 3);
return 0;
}