通过用户定义的 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();
}
请注意,如果您在原始元素之前插入新元素,您仍然可以使索引无效。
使用 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();
}
请注意,如果您在原始元素之前插入新元素,您仍然可以使索引无效。