Итак, я вычисляю Biconnected Components (BCC)
в undirected graph
, после вычисления мой алгоритм также включает в себя некоторые Bridge
ребра в некоторых BCC, поэтому в качестве шага постобработки я запускаю цикл для каждого BCC
(представлен как vector<pair<int, int>>
, каждый pair<int, int>
представляет edge
в этом 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());
}
Bridges
снова является set
из pair<int, int>
с, содержащий все ребра моста, найденные моим алгоритмом.
BCC
- это unordered_map<int, vector<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());
}
Все, что я сделал, это удалил &
до BCCList
в первой строке внутри for-loop
.Это делает код неработающим и выдает результат, как будто этот for-loop
никогда не выполняется;никакие ребра моста в любом BCC не удаляются, таким образом, вычисляя неправильные BCC в конце.Скажите, пожалуйста, почему это происходит?
Я всегда думал, что если у меня есть bcc
подобный итератор на unordered_map
, то bcc->first
- это key
(здесь bcc->first
должно бытьint
) и bcc->second
- это value
(здесь bcc->second
должно быть vector<pair<int, int>>
).Это не правильно?Почему я должен явно указать &
(ссылочная переменная), чтобы код работал?
Возможно, это поведение как-то связано с remove_if
?