通过用户定义的 class 元素的向量就地修改向量成员变量

In-place modification of a vector member variable through a vector of user-defined class elements

使用 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 对象的指针向量。 range for循环遍历单元格,一个Cell对象的向量,为单元格的每个元素提供一个引用变量(Cell& cell)。

cell 上的地址运算符(引用变量)returns 指向 push_back 的(Cell*)指针到 cells_copy 上?没看懂。

我的想法是,我有一个 vector 个用户定义 (Cell) 对象,每个对象都包含一个 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,returns 指向该对象的指针。这就是为什么您的 vector<Cell*> 允许您将 &cell 推回其中的原因。


就地修改原来的vector而言,你真的不需要构建一个vector<Cell*>,你可以直接在for循环中进行。

事实上,先把每一项都做成指针的vector是很危险的,因为如果你增加原vector的大小,它可以重新分配原vector中的对象,并使你创建的指针指向垃圾值。

Demo of printing garbage values


如果你确实想在原始向量中存储一些项目,最好存储索引,然后你可以修改原始向量,如:

for(auto index : indices)
{
    original_vector[index].do_something();
}

请注意,如果您在原始元素之前插入新元素,您仍然可以使索引无效。