从邻接表 C++ 中删除元素

Remove elements from adjacency list C++

这是我定义邻接表的方式: vector<vector<int>> adj;

我想遍历整个邻接表并查找某个值是否存在。如果该值存在于邻接表中,我想删除它。我尝试了两种方法:

方法一:

for(auto elem: adj){
        for(auto ind: elem){
            if(elem[ind]==num){
                elem.erase(elem.begin()+ind);
            }
        }
    }

方法二:

auto it=elem.find(num);
if (it!=elem.end())
    elem.erase(it);

第二种方法抛出一个错误

no member named 'find' in 'std::vector<int, std::allocator >'

谁能告诉我为什么我尝试过的方法不起作用,我能做些什么来解决这个问题?谢谢

这:auto it=elem.find(num); 不起作用,因为 std::vector 没有名为 find.

的成员函数

要在向量中查找项目,您可以使用 std::find 代替:

auto it=std::find(elem.begin(), elem.end(), num);
if (it!=elem.end())
    elem.erase(it);

两点:如果邻接表中的元素没有任何特定的顺序,您可以通过将元素交换到向量的末尾,然后从那里删除它来加快此操作。

另一方面,如果元素的顺序已知,您可以使用 std::lower_bound 更快地找到元素(对数时间而不是线性时间)。

另一种可能性是使用 std::setstd::unordered_set 而不是 std::vector。如果你正在处理非常大和密集的图(所以每个节点都有一个 lot 相邻节点)这可能是有意义的 - 例如,你可以从中找到并删除一个元素a std::set 在对数时间而不是线性时间。问题是要实现这一点,它通常被实现为平衡树,每个节点都从免费存储中单独分配。因此,尽管它的计算复杂度(相当多)较低,但它每次操作的时间常数通常要高得多。