проблема с оператором [] при использовании вектора

#c #c 11 #vector #operator-keyword #copy-constructor

Вопрос:

Я пытаюсь создать конструктор копий для игры. на протяжении всего конструктора копирования мне приходится копировать элементы одной игры в другую. Однако когда я пытаюсь получить доступ к внутренним элементам игры, которые я хочу скопировать, я получаю сообщение об ошибке :

 no operator "[]" matches these operands -- operand types are: mtm::Game [ std::_Vector_const_iterator<std::_Vector_val<std::conditional_t<true, std::_Simple_types<std::vector<char, std::allocator<char>>>, std::_Vec_iter_types<std::vector<char, std::allocator<char>>, size_t, ptrdiff_t, std::vector<char, std::allocator<char>> *, const std::vector<char, std::allocator<char>> *, std::vector<char, std::allocator<char>> amp;, const std::vector<char, std::allocator<char>> amp;>>>> ]C/C  (349)
 

Я был бы признателен за любую помощь в объяснении того, почему оператор [] не работает, вот фрагмент кода, который я написал :

 Game::Game(const Gameamp; other)
{
    Game game(other.height, other.width);

    for (vector<vector<char>>::const_iterator row = other.game.begin(); row != 
                                                              other.game.end(); row  )
    {
        for(vector<char>::const_iterator col = row->begin(); col != row->end(); col  )
        {                
            game[row][col] = other[row][col];  ///////???
        }
    }
 

В дополнение к этому я хотел бы спросить, лучше ли выделить игру с помощью «новой» или просто объявить ее, как я сделал в своем сегменте кода выше.

Комментарии:

1. Сначала вы можете удалить весь конструктор копирования, потому что конструктор копирования по умолчанию уже работает, если нет других переменных.

2. И итератор-это ничто, что вы можете использовать для обозначения вектора, а итератор больше похож на указатель на элемент, поэтому вам нужно только разыменовать переменную строки, чтобы получить строку.

3. @Lala5th я пробовал использовать в, но это тоже не сработало

4. @gerum ты имеешь в виду, что я должен *грести ? и есть еще несколько переменных, которые я просто не включил в сегмент кода

5. @Saleh Ваш копирайтер не имеет никакого эффекта. Просто удалите его, одного по умолчанию будет достаточно. Вы пытаетесь скопировать данные из other локальной переменной game . После завершения процесса копирования эта локальная переменная перестанет существовать, а текущий экземпляр останется неинициализированным. (если только вы не сделаете что-то с game тем, что вы здесь не показали)

Ответ №1:

[] Оператор вектора ожидает size_t аргумента. Вы передаете итератор, поэтому он не компилируется.

other[row][col] может быть заменен просто *col . game[row][col] это немного сложнее, вы не можете использовать row col итераторы and game , так как они взяты из другого контейнера. Вы можете преобразовать итераторы в числовые индексы , вычитая их из begin , например: other[row - other.game.begin()][col - row->begin()] . Это становится довольно трудным для чтения, поэтому вам может быть лучше либо использовать два отдельных итератора для каждого контейнера, либо просто использовать индексы для обоих контейнеров.

Лучшее решение-позволить стандартной библиотеке выполнять работу за вас:

 std::copy(other.game.begin(), other.game.end(), game.begin());
 

Нет необходимости копировать элементы внутреннего вектора один за другим, назначение вектора другому делает копирование за вас.