因此,我在计算Biconnected Components (BCC)
时计算了undirected graph
,在计算之后,我的算法也在某些BCC中也包含了一些Bridge
边缘,因此在后处理步骤中,我在每个BCC
(表示为vector<pair<int, int>>
上运行一个循环,每个pair<int, int>
表示该BCC。)这是我的操作方式:
auto pred = [&Bridges](pair<int, int>& edge) -> bool
{
return Bridges.find(edge) != Bridges.end();
};
for (auto bcc = BCC.begin(); bcc != BCC.end(); bcc++)
{
vector<pair<int, int>>& BCCList = (bcc->second);
BCCList.erase(remove_if(
BCCList.begin(), BCCList.end(), pred), BCCList.end());
}
edge
再次是Bridges
的set
,包含我的算法找到的所有Bridge边缘。pair<int, int>
是BCC
。上面的代码按预期工作,删除了之前在BCC vector 中可能存在的所有Bridge边缘。但是,如果我稍作更改,然后执行以下操作:
auto pred = [&Bridges](pair<int, int>& edge) -> bool
{
return Bridges.find(edge) != Bridges.end();
};
for (auto bcc = BCC.begin(); bcc != BCC.end(); bcc++)
{
vector<pair<int, int>> BCCList = (bcc->second);
BCCList.erase(remove_if(
BCCList.begin(), BCCList.end(), pred), BCCList.end());
}
我要做的就是在
unordered_map<int, vector<pair<int, int>>>
的第一行中的&
之前删除BCCList
。这使代码无法正常工作,并且产生的结果好像此for-loop
从未执行过;没有删除任何BCC中的桥边缘,从而最终计算出错误的BCC。请告诉我为什么会这样?我一直以为如果在
for-loop
上有一个像迭代器这样的bcc
,那么unordered_map
是bcc->first
(在这里,key
应该是bcc->first
),而int
是bcc->second
(在这里,value
应该是bcc->second
)。这不正确吗?为什么我必须明确指定vector<pair<int, int>>
(引用变量)才能使代码正常工作?这种行为可能与
&
有关吗? 最佳答案
vector<pair<int, int>>& BCCList = (bcc->second);
在这里,
BCCList
是bcc->second
中存储的 vector 的引用(替代名称)。您对BCCList
所做的任何更改实际上都是对bcc->second
所做的。vector<pair<int, int>> BCCList = (bcc->second);
在这里,
BCCList
是bcc->second
中存储的 vector 的副本。这是一个单独的对象。对其进行的更改完全不会影响bcc->second
。这是一个更简单的示例,其中应该更清楚地说明正在发生的事情:
int data = 42;
int *bcc = &data;
int &ref = *bcc;
ref = 314;
int cop = *bcc;
cop = -42;
我认为您不希望分配
cop = -42;
修改data
。代码中的情况完全相同。