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