因此,我在计算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再次是Bridgesset,包含我的算法找到的所有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_mapbcc->first(在这里,key应该是bcc->first),而intbcc->second(在这里,value应该是bcc->second)。这不正确吗?为什么我必须明确指定vector<pair<int, int>>(引用变量)才能使代码正常工作?

这种行为可能与&有关吗?

最佳答案

vector<pair<int, int>>& BCCList = (bcc->second);

在这里,BCCListbcc->second中存储的 vector 的引用(替代名称)。您对BCCList所做的任何更改实际上都是对bcc->second所做的。
vector<pair<int, int>> BCCList = (bcc->second);

在这里,BCCListbcc->second中存储的 vector 的副本。这是一个单独的对象。对其进行的更改完全不会影响bcc->second

这是一个更简单的示例,其中应该更清楚地说明正在发生的事情:
int data = 42;
int *bcc = &data;

int &ref = *bcc;
ref = 314;

int cop = *bcc;
cop = -42;

我认为您不希望分配cop = -42;修改data。代码中的情况完全相同。

10-08 04:10