通过用户定义类元素的向量对向量成员变量进行就地修改



使用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();
}

要知道,如果在原始元素前面插入新元素,仍然可以使索引无效。

最新更新