使用Visual Studio C++2019
为什么会失败。。。
std::vector<Cell> cells{ 9 };
std::vector<Cell*> cells_copy;
for (Cell& cell : cells)
cells_copy.push_back(cell);
这行得通吗?
std::vector<Cell> cells{ 9 };
std::vector<Cell*> cells_copy;
for (Cell& cell : cells)
cells_copy.push_back(&cell);
我看到的是cells_copy
是指向用户定义的Cell
对象的指针向量。循环的范围在单元格(Cell
对象的向量(中迭代,为单元格的每个元素提供参考变量(Cell& cell
(。
cell
(引用变量(上运算符的地址将指向push_back
的(Cell*
(指针返回到cells_copy
?我不明白。
这个想法是,我有一个用户定义(Cell
(对象的vector
,每个对象都包含一个vector<int>
成员变量,称为m_candidates
。
我想取这个vector<Cell>
集合的一个子集,并在适当的位置修改每个单元格的m_candidate
变量。我认为构建一个指针向量就可以了,而且它确实有效,但我不明白为什么。。
任何想法/备选方案都会受到赞赏。
您似乎对感到困惑
for (Cell& cell : cells)
^^^^^^^^^^
与
cells_copy.push_back(&cell);
^^^^^
在第一个Cell& cell
中,您将声明cell
作为引用。这意味着,你对cell
所做的任何事情,都将应用于向量中的原始单元。但是,当您尝试将cell
推回vector<Cell*>
时,cell
本身被视为Cell
对象,而不是指针。
而第二个&cell
将运算符的地址应用于cell
,后者返回指向该对象的指针。这就是为什么您的vector<Cell*>
允许您将&cell
推回其中的原因。
就修改原始vector
而言,您实际上不需要构建vector<Cell*>
,您可以直接在for循环中进行。
事实上,首先为每个项创建一个指针向量是危险的,因为如果你增加原始向量的大小,它可能会重新分配原始向量中的对象,并使你创建的指针指向垃圾值。
打印垃圾值的演示
如果你确实想在原始向量中存储一些项目,最好存储索引,然后你可以修改原始向量,比如:
for(auto index : indices)
{
original_vector[index].do_something();
}
要知道,如果在原始元素前面插入新元素,仍然可以使索引无效。