将指向向量向量的指针移动到特定位置
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 = &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->begin = maze.begin()
,但我想将line
移动到maze
中的任何位置。
什么概念上的差异不允许我像分配 column
一样分配 line
?
谢谢。
【问题讨论】:
【参考方案1】:我不清楚指针线是如何工作的。
这一行
auto * line = new std::vector<std::vector<int>>(maze);
创建std::vector<std::vector<int>>
的新实例,将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<T>
将其元素存储在连续内存中。但是,该内存不在vector
对象内。因此,std::vector<std::vector<T>>
中的 T
s 存储在连续的块中,但它们作为一个整体并不连续。外部vector
拥有一个vector<T>
s 的连续块,每个内部vector<T>
拥有一个单独的int
s 连续块。总的来说,int
s 的各个块分散在内存中。
【讨论】:
谢谢你的解释,现在更有意义了。我想用指针来更好地练习它们。我认为使用 [] 运算符会更容易,但我想尝试其他方法 @xampierre 你需要学习的关于原始指针的最重要的技能就是不要使用它们。严重地。更不用说你应该使用new
来创建对象。而且您几乎从不想动态创建标准容器。
@xampierre 我不会说“尽可能”,但是当您需要指针时,几乎总是应该使用智能指针。以上是关于将指向向量向量的指针移动到特定位置的主要内容,如果未能解决你的问题,请参考以下文章