将指向向量向量的指针移动到特定位置

Posted

技术标签:

【中文标题】将指向向量向量的指针移动到特定位置【英文标题】:Moving pointer to vector of vectors to specific position 【发布时间】:2020-07-22 19:35:27 【问题描述】:

我有一个整数向量的maze 向量和一个指向该向量的指针line,声明如下。我还有一个指向 line 的指针,它特别标识了每个元素。

    std::vector<std::vector<int>> maze;
    auto * line = new std::vector<std::vector<int>>(maze); //pointer to maze to hold line position
    auto * column = line; // pointer to element in line

maze 是包含数字的 int 向量的向量。我应该按照从 1 开始到下一个最高数字(+1)的路线,直到我在迷宫内找到出口或死胡同。

我不清楚指针line 是如何工作的。我的理解是它将保存maze的第一个向量中第一个元素的地址。通过写line+1,指针将保存第二个向量的第一个元素的地址等。编译器让我写column = &amp;line[1],我假设column将指向line[1]的第一个元素。

但是,我没有找到让line 指向maze 中的特定向量的方法。我尝试了以下所有原因的错误:

line = &maze[i]; // make line point to i-th vector in maze
line = &(*maze.begin()); // as suggested in a *** topic, converting iterator to pointer
*line = maze[i];

我没有出错的唯一方法是写line-&gt;begin = maze.begin(),但我想将line 移动到maze 中的任何位置。

什么概念上的差异不允许我像分配 column 一样分配 line? 谢谢。

【问题讨论】:

【参考方案1】:

我不清楚指针线是如何工作的。

这一行

auto * line = new std::vector<std::vector<int>>(maze);

创建std::vector&lt;std::vector&lt;int&gt;&gt; 的新实例,将maze 的内容复制到该新实例中,然后将指向新实例的指针存储在line 中。 line 不是指向 maze 的指针!应该是这样的:

auto * line = &maze;

通过写入 line+1,指针将保存第二个向量的第一个元素的地址等。

没有。 line 不是指向数组的指针,也不是指向数组元素的指针,所以你不能递增它(好吧,准确地说,它可以被认为是一个有一个元素的数组,所以指针递增一次就可以了,但除此之外的任何东西都不是)。

我没有出错的唯一方法是写 line->begin = maze.begin()

我会跳过其余的,因为你走错了路,我不得不承认我并不完全理解第二个 sn-p 应该做什么。

但是,我没有找到让线指向迷宫中特定向量的方法

不清楚为什么你首先需要一个指针。 maze 的一个元素你通过

auto x = maze[i][j];

参考来源

auto& r = maze[i][j];

和一个指针通过

auto* p = &maze[i][j];

目前还不清楚您要完成什么。很明显,您尝试使用 line 是有缺陷的,因为它不是指向 maze 的指针。

PS:如果您打算使用指针算法在maze 中导航,那么有一个坏消息:它不起作用。至少不像你希望的那么容易。 std::vector&lt;T&gt; 将其元素存储在连续内存中。但是,该内存不在vector 对象内。因此,std::vector&lt;std::vector&lt;T&gt;&gt; 中的 Ts 存储在连续的块中,但它们作为一个整体并不连续。外部vector 拥有一个vector&lt;T&gt;s 的连续块,每个内部vector&lt;T&gt; 拥有一个单独的ints 连续块。总的来说,ints 的各个块分散在内存中。

【讨论】:

谢谢你的解释,现在更有意义了。我想用指针来更好地练习它们。我认为使用 [] 运算符会更容易,但我想尝试其他方法 @xampierre 你需要学习的关于原始指针的最重要的技能就是不要使用它们。严重地。更不用说你应该使用new 来创建对象。而且您几乎从不想动态创建标准容器。 @xampierre 我不会说“尽可能”,但是当您需要指针时,几乎总是应该使用智能指针。

以上是关于将指向向量向量的指针移动到特定位置的主要内容,如果未能解决你的问题,请参考以下文章

基础对象和继承对象的向量

检查指向向量 C++ 中对象的指针

如何计算指向不同向量数组中特定对象的指针的出现次数

指针复杂度的排序向量

C++ 将单个元素移动到向量中的新位置的最简单最有效的方法

将指向自定义对象的指针向量存储到文件中