我用C ++编写了以下程序,但出现了以下错误。遍历2D向量似乎是一个问题
我已经尝试过写作,int j = matrix.at(0).begin()
但效果不佳
我遇到以下错误
invalid operands to binary expression ('vector<int>::iterator' (aka '__wrap_iter<int *>') and 'std::__1::vector<int, std::__1::allocator<int> >::size_type' (aka 'unsigned long'))
no viable conversion from 'std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >::iterator' (aka '__wrap_iter<std::__1::vector<int, std::__1::allocator<int> > *>') to 'int'
#include <stdio.h>
#include <vector>
#include <iterator>
using namespace std;
int diagonalSum(vector<vector<int> > matrix) {
int sum[2] = {0};
vector<int> s;
for(int i = matrix.begin();i < matrix.size();i++)
{
for(int j = matrix[i].begin();j < matrix.[i].size();j++)
{
if(i == j)
sum[0]+=matrix[i][j];
if((i+j) == matrix.size())
sum[1]+=matrix[i][j];
}
}
return (sum[0] + sum[1]);
}
int main()
{
vector <vector<int> > matrix = {
{2,4,6},{4,8,12},{6,12,18}
};
int dSum = diagonalSum(matrix);
return 0;
}
这段代码有几个问题。
一,性能:
int diagonalSum(vector<vector<int> > matrix) {
每次调用函数时,上面的方法都会复制矩阵及其所有元素,这没有明显的原因。复杂度:O(n 2)。
更好地引用const(复杂度O(1)):
int diagonalSum(const vector<vector<int> > & matrix) {
然后,代码尝试从中复制一个迭代器对象,matrix.begin()
该对象应该在类型的对象上进行迭代vector<int>
,并尝试将此迭代器分配给一个整数变量。整数和迭代器是不兼容的类型,不能互相分配,因此会出错。
我假设您想使用索引来代替:
for(int i = 0;i < matrix.size();i++)
{
for(int j = 0; j < matrix[i].size();j++)
从复杂性的角度来看,这甚至是一个不好的解决方案。您的解决方案是O(n 2),其中您的任务可以轻松地在O(n)中执行一次循环。
我仍然无法初始化向量,请在这个问题上指导我
@taherlunawadi在这里运作良好:godbolt.org/z/1tpDCQ(尽管这
using namespace std;
是一个非常糟糕的主意)@taherlunawadi另请注意,您的代码有错误。您的对角线之一计算不正确。您正在汇总您真正想要的对角线右边的元素。您可以在调试器中调试代码(这是非常重要的一课),也可以打印许多访问的中间值。例如,在将它们求和的值添加到结果中之前,将其打印出来。这将使您了解正在发生的事情。
我无法正确提取错误,请您详细说明一下?
通常最好使用尽可能小的示例来最好地执行@TaherLunawadi调试。例如1x1矩阵,或2x2。检查
sum
数组中的值。只有一个对角线错了吗?都是吗 一次检查一辆越野车中的每一步(在调试器中为单步,或打印每一步)。调试是程序员生活的一部分-您必须精通它