[英]array of vectors or vector of arrays?
我是C ++ STL的新手,我无法理解图形表示。
vector<int> adj[N];
那么这会创建一个类型向量数组,还是会创建一个数组向量? BFS代码似乎遍历在adj [i]的每个实例处出现的值列表,因此它看起来像一个向量数组。 创建向量的语法是:
vector<int> F;
这将有效地创建单维向量F.
有什么区别
vector< vector<int> > N;
和
vector<int> F[N]
那么这个(
vector<int> adj[N];
)创建一个vector类型的数组还是创建一个数组向量?
它创建了矢量数组
有什么区别
vector< vector<int> > N;
和
vector<int> F[N]
在第一种情况下,您将创建动态数组的动态数组(向量矢量)。 每个向量的大小可以在运行时更改,所有对象都将在堆上分配。
在第二种情况下,您将创建一个固定大小的向量数组。 你必须在编译时定义N
,并且所有向量都将放在堆栈上† ,但是,每个向量将在堆上分配元素。
我总是喜欢vector vector of vector(或矩阵,如果你可以使用第三方库),或std::array
of std::array
s,如果是编译时大小的话。
我是C ++ STL的新手,我无法理解图形表示。
您还可以将图表表示为std::unordered_map<vertex_type,std::unordered_set<vertex_type>>
,其中vertex_type
是顶点的类型(在您的情况下为int
)。 当边数不是很大时,可以使用这种方法来减少内存使用。
† :准确地说 - 并不总是在堆栈上 - 它可能是堆上复杂对象的一部分。 此外,C ++标准没有定义堆栈或堆的任何要求,它仅提供存储持续时间的要求,例如自动,静态,线程或动态。
简答:
它是vector <int>
的数组。
答案很长:
在阅读诸如此类的声明时
vector<int> adj[N];
编译器使用称为“螺旋 - ”或“顺时针规则”的方法来解释它的含义。 螺旋规则背后的想法是你从变量名开始,然后以顺时针螺旋向外移动,以便找出它是什么类型的变量。 例如:
char* str [10];
可以解释如下:
____
| |
char* str [10];
|_________|
使str
成为10个char*
的数组。
因此, vector<int> adj[N];
是一个向量数组而不是数组向量
实践完美:
1: int * foo [ ];
意思?
回答:
“foo”是指向整数的指针数组
2: int * (*foo [ ] )();
意思?
回答:
“foo”是指向返回指向整数的指针的函数的指针数组
3: int * (*(*foo [ ] )())();
意思?
回答:
“foo”是一个指向函数的指针数组,返回指向函数的指针,返回指向整数的指针
vector<int> arr[N];
它显示一个向量数组,每个数组[i]都有一个存储在其中的向量,可以遍历许多值。 它就像一个链接列表数组,其中磁头只存储在array [i]位置。
vector<vector<int> > N vs vector<int> F[N]
2D矢量和矢量数组之间的区别在于2D矢量可以跨越大小,而矢量数组的尺寸固定为数组大小。
在引擎盖下,矢量仍然使用数组,它是特定于实现的,但可以安全地认为:
vector<int>
在内部创建一个int []。 什么向量给你的是它从你那里抽象的部分,如果你想重新调整大小,你不必手动重新分配等,它会为你做这个(当然还有更多)。 当你这样做: vector<vector<int>>
你将创建一个向量向量,意味着一个2D矩阵。 您可以根据需要嵌套它。 Vector接受类型T并分配该类型的数组。 因此,如果您将vector作为类型T传递,它将有效地执行您在第一行中执行的操作,即vector<int>
的数组。 希望它有意义
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.