C++ 从邻接列表C和x2B中删除元素+;
这是我定义邻接列表的方式: 向量调整代码> 我想遍历整个邻接列表,看看是否存在某个值。如果邻接列表中存在该值,我想将其删除。我尝试了两种方法: 方法1:C++ 从邻接列表C和x2B中删除元素+;,c++,vector,depth-first-search,auto,adjacency-list,C++,Vector,Depth First Search,Auto,Adjacency List,这是我定义邻接列表的方式: 向量调整 我想遍历整个邻接列表,看看是否存在某个值。如果邻接列表中存在该值,我想将其删除。我尝试了两种方法: 方法1: for(auto elem: adj){ for(auto ind: elem){ if(elem[ind]==num){ elem.erase(elem.begin()+ind); } } } 方法2: auto it=elem
for(auto elem: adj){
for(auto ind: elem){
if(elem[ind]==num){
elem.erase(elem.begin()+ind);
}
}
}
方法2:
auto it=elem.find(num);
if (it!=elem.end())
elem.erase(it);
第二种方法使我犯了一个错误
“std::vector”中没有名为“find”的成员
有人能告诉我为什么我尝试过的方法不起作用,我能做些什么来解决这个问题?谢谢这个:
autoit=elem.find(num)代码>不起作用,因为std::vector
没有名为find
的成员函数
要查找向量中的项目,可以使用std::find
:
autoit=std::find(elem.begin(),elem.end(),num);
if(it!=elem.end())
删除(它);
两点:如果邻接列表中的元素没有任何特定的顺序,您可能可以通过将元素交换到向量的末尾,然后从那里将其删除来加速此操作
另一方面,如果元素的顺序已知,则可以使用std::lower_bound
更快地找到元素(对数时间而不是线性时间)
另一种可能是使用std::set
或std::unordered\u set
而不是std::vector
。如果您处理的图形非常大且密集(因此每个节点都有许多相邻节点),这可能是有意义的,例如,您可以在对数时间而不是线性时间内从std::set
中查找并删除元素。问题是,为了实现这一点,它通常实现为平衡树,每个节点从空闲存储中单独分配。因此,尽管它的计算复杂度较低(相当多),但每次操作的时间常数通常较高。使用std::map可能会更好,它具有查找功能,并且在对数时间内查找操作。这段代码将在线性时间内找到(如果向量较大,则速度会慢得多)@AlexCornford:如果你要沿着这个方向走,你可能需要std::set
而不是std::map
。我很少处理大多数节点都有足够邻居的图,这对我很有帮助。并不是说他们不存在,但我遇到的很少有人是这样的。