我试图了解退出范围时析构函数调用的顺序。假设我有以下代码:
class Parent{
Parent(){cout<<"parent c called \n";}
~Parent(){cout<< "parent d called \n";}
};
class Child: public parent{
Child(){cout<< "child c called \n";}
~Child(){cout<<"child d called\n";}
};
Run Code Online (Sandbox Code Playgroud)
现在,我知道子构造函数和析构函数是从父对象派生的,因此以下主要内容:
int main(){
Parent Man;
Child Boy;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
会产生输出:
parent c called
parent c called
child c called
... //Now what?
Run Code Online (Sandbox Code Playgroud)
但是现在,当我退出范围时会发生什么?我有多个需要销毁的东西,那么编译器是如何选择顺序的呢?我可以有两种输出可能性:
parent c called | parent c called
parent c called | parent c called
child c called | child c called
child d called | parent d called
parent d …Run Code Online (Sandbox Code Playgroud) 我一直在研究连接组件,并在Wikipedia上看到了这个描述:
使用广度优先搜索或深度优先搜索在线性时间内计算图的连通分量(根据图的顶点和边的数量)很简单。在任何一种情况下,从某个特定顶点 v 开始的搜索将在返回之前找到包含 v(并且仅此而已)的整个连接组件。要查找图的所有连接组件,请遍历其顶点,每当循环到达尚未包含在先前找到的连接组件中的顶点时,开始新的广度优先或深度优先搜索。
此操作的运行时间是多少?我遇到过一些消息来源说连接的组件是O(n)及时完成的。然而,据我所知,在最坏的情况下,每个顶点都是它自己的连接组件,这个算法必须执行 n 个 DFS/BFS 操作,每个操作都是它自己的O(n)时间。因此,不应该是 this 的运行时间O(n^2)吗?