繁体   English   中英

向量数组或数组向量?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM