使用向量时 [] 运算符的问题

problem with [] operator when using a vector

提问人:Saleh 提问时间:8/28/2021 最后编辑:Alan BirtlesSaleh 更新时间:8/28/2021 访问量:122

问:

我正在尝试为 Game 制作一个复制构造函数。在整个复制构造函数中,我必须将一个游戏的元素复制到另一个游戏中。但是,当我尝试访问要复制的游戏内部时,我收到一个错误,说:

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>> &, const std::vector<char, std::allocator<char>> &>>>> ]C/C++(349)

我将不胜感激任何帮助解释为什么 [] 运算符不起作用,这是我写的一段代码:

Game::Game(const Game& 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];  ///////???
        }
    }

除此之外,我还想问一下,使用“new”来分配游戏是否更好,或者只是像我在上面的代码段中所做的那样声明它。

C++ C++11 向量 运算符-关键字 复制构造函数

评论

1赞 gerum 8/28/2021
首先,您可以删除整个复制构造函数,因为如果没有更多变量,默认复制构造函数已经在工作。
0赞 gerum 8/28/2021
而迭代器什么都不是,你可以使用向量的索引,而迭代器更像是指向元素的指针,所以你只需要取消引用行变量即可获得行。
0赞 Saleh 8/28/2021
@Lala5th我尝试使用 at 但效果不佳
0赞 Saleh 8/28/2021
@gerum你的意思是我应该做*row?还有更多变量,我只是没有将它们包含在代码段中
1赞 Lukas-T 8/28/2021
@Saleh 您的 copy-ctor 没有任何影响。只需删除它,默认的就足够了。您正在尝试将数据从 复制到局部变量 。copy-ctor 退出后,此局部变量将不复存在,当前实例将保持未初始化状态。(除非你做了一些你没有在这里显示的东西)othergamegame

答:

1赞 Alan Birtles 8/28/2021 #1

向量的运算符需要一个参数。您正在传递迭代器,这就是它不编译的原因。[]size_t

other[row][col]可以只用 替换为 。 有点棘手,你不能使用 和 迭代器,因为它们来自不同的容器。您可以通过从 中减去迭代器来将迭代器转换为数字索引,例如: 。这很难阅读,因此最好为每个容器使用两个单独的迭代器,或者只对两个容器使用索引。*colgame[row][col]rowcolgamebeginother[row - other.game.begin()][col - row->begin()]

更好的解决方案是让标准库为您完成工作:

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

无需逐个复制内部向量的元素,将一个向量分配给另一个向量即可为您进行复制。