Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从邻接列表C和x2B中删除元素+;_C++_Vector_Depth First Search_Auto_Adjacency List - Fatal编程技术网

C++ 从邻接列表C和x2B中删除元素+;

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

这是我定义邻接列表的方式: 向量调整

我想遍历整个邻接列表,看看是否存在某个值。如果邻接列表中存在该值,我想将其删除。我尝试了两种方法:

方法1:

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
。我很少处理大多数节点都有足够邻居的图,这对我很有帮助。并不是说他们不存在,但我遇到的很少有人是这样的。