Как исправить недопустимые операнды в бинарном выражении? - PullRequest
0 голосов
/ 03 июля 2019

Я написал следующую программу на 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;
}

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

У этого кода есть несколько проблем.

Во-первых, производительность:

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) одним циклом.

1 голос
/ 03 июля 2019

Vector.begin () метод возвращает итератор , указывающий на первый элемент в векторе.Вот почему вы не можете присвоить его переменной int.

Измените цикл for на этот

for(int i = 0;i < matrix.size();i++)
    {
        for(int j = 0;j < matrix[i].size();j++)
        {
            if(i == j)
                sum[0]+=matrix[i][j];
            if((i+j) == (matrix.size() -1))
                sum[1]+=matrix[i][j];
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...