尝试取消引用 2D 矢量中的元素时出错

Posted

技术标签:

【中文标题】尝试取消引用 2D 矢量中的元素时出错【英文标题】:Error When Trying To Deference An Element In A 2D Vector 【发布时间】:2020-03-19 19:09:30 【问题描述】:

这里是 C++ 新手。我有一个指针变量类型vector,我通过m 将其初始化为n,其中nm 是int 作为输入。这是我初始化它的方式。

std::vector<std::vector<int>>* memo; // This is as a member.

void test(int m, int n) 
    memo = new std::vector<std::vector<int>>(m, *new std::vector<int>(n, 0)); // This is inside a method.

稍后,我尝试分配某个元素。

int ans = 5; // In my actual code, it's something else, but I'm just simplifying it.
memo[i][j] = ans; // This gives an error.

我以为我只需要尊重它,因为现在它是一个指针类型。所以我把它改成了这样:

*memo[i][j] = ans;

但是现在我遇到了一个新错误:

C++ no operator matches these operands            operand types are: * std::vector<int, std::allocator<int>>

为什么这不起作用,我怎样才能使它起作用?

【问题讨论】:

您可能不需要std::vector&lt;T&gt;* 类型,而是std::vector&lt;T&gt; 类型。 C++ 有时很难,但并非不可能正确学习。放弃指针,您就可以开始了。 几乎没有理由拥有指向容器的指针。更糟糕的是,由于*new std::vector&lt;int&gt;(n, 0),您将遇到内存泄漏。您是否来自必须使用new 创建对象的 Java 或 C# 背景?在 C++ 中,您不必这样做。我建议你投资a good book or two。 至于*memo[i][j]的问题,由于operator precedence等于*(memo[i][j]),开头不正确(memo是指针)。您需要使用(*memo)[i][j]。但正如我已经说过的,没有指针开始,问题就消失了。 【参考方案1】:

首先声明一下

std::vector<std::vector<int>>* memo;

意义不大。像这样声明数据成员会更好

std::vector<std::vector<int>> memo;

这个分配

memo = new std::vector<std::vector<int>>(m, *new std::vector<int>(n, 0));

不正确。向量的元素不是指针。你应该写

memo = new std::vector<std::vector<int>>(m, std::vector<int>(n, 0)); 

memo = new std::vector<std::vector<int>>(m, std::vector<int>(n ));

这似乎是你其他问题的原因。

要为这样的向量设置值,您应该编写示例

( *memo )[i][j] = ans;

如果将数据成员声明为不是指针,例如

std::vector<std::vector<int>> memo;

然后在一个函数中你可以像这样分配它

memo.assign( m, std::vector<int>( n ) );

【讨论】:

谢谢!我以前从来不知道你可以在非指针类型上使用new 关键字。 @NishantChatterjeeKMS 你错了。分配显示为您声明指向向量的指针。:) 那么这个声明对于非指针类型向量是否合适? memo = std::vector&lt;std::vector&lt;int&gt;&gt;(m, std::vector&lt;int&gt;(n)); @NishantChatterjeeKMS 您可以在构造函数的 mem-initializer lisy 中这样设置它。否则,您可以使用例如方法分配。请参阅我的更新答案。

以上是关于尝试取消引用 2D 矢量中的元素时出错的主要内容,如果未能解决你的问题,请参考以下文章

尝试从赛普拉斯中的元素获取属性时出错

索引 2D 矢量正在使我的程序崩溃

打印矢量元素

在访问向量矢量的元素时的分段错误

通过指针、强制转换和取消引用加载向量?

我正在尝试通过引用发送 2d 矢量,但似乎它不适用于几乎相同的方法