我是C ++ STL的新手,我在理解图表表示时遇到了麻烦。
vector<int> adj[N];
这样做会创建一个类型为vector的数组,还是会创建一个数组向量? BFS代码似乎遍历在adj [i]的每个实例处出现的值列表,因此它看起来像一个向量数组。 创建向量的语法是:
vector<int> F;
将有效地创建单维向量F.
之间有什么区别
vector< vector<int> > N;
和
vector<int> F[N]
答案 0 :(得分:39)
这样做(
vector<int> adj[N];
)创建一个类型为vector的数组,或者这会创建一个 数组向量?
它创建了矢量数组
之间有什么区别
vector< vector<int> > N;
和
vector<int> F[N]
在第一种情况下,您将创建动态数组的动态数组(向量向量)。每个向量的大小可以在运行时更改,所有对象都将在堆上分配。
在第二种情况下,您将创建一个固定大小的向量数组。您必须在编译时定义N
,并且所有向量都将放在堆栈†上,但是,每个向量将在堆上分配元素。
我总是喜欢vector vector of vector(或者矩阵,如果你可以使用第三方库),或者std::array
std::array
的编译时大小。
我是C ++ STL的新手,我无法理解图表 表示。
您也可以将图表表示为std::unordered_map<vertex_type,std::unordered_set<vertex_type>>
,其中vertex_type
是顶点的类型(在您的情况下为int
)。当边数不是很大时,可以使用这种方法来减少内存使用量。
†:准确地说 - 并不总是在堆栈上 - 它可能是堆上复杂对象的一部分。此外,C ++标准没有定义堆栈或堆的任何要求,它只提供存储持续时间的要求,例如自动,静态,线程或动态。
答案 1 :(得分:14)
简答:
它是vector <int>
s的数组。
长答案:
在阅读诸如
vector<int> adj[N];
编译器使用一种称为&#34;螺旋 - &#34; 或&#34;顺时针规则&#34; 的方法来解释这是什么意思。螺旋规则背后的想法是你从变量名开始,然后以顺时针螺旋向外移动,以便找出它是什么类型的变量。例如:
char* str [10];
可以这样解释:
____
| |
char* str [10];
|_________|
将str
数组设为10 char*
s。
因此,vector<int> adj[N];
是一个向量数组而不是数组向量
练习变得完美:
1:int * foo [ ];
是什么意思?
答案:
&#34; foo&#34;是一个指向整数的指针数组
2:int * (*foo [ ] )();
是什么意思?
答案:
&#34; foo&#34;是指向函数的指针数组,返回指向整数的指针
3:int * (*(*foo [ ] )())();
是什么意思?
答案:
&#34; foo&#34;是一个指向函数的指针数组,返回指向函数的指针,返回指向整数的指针
答案 2 :(得分:8)
sudo find . -type d -exec chmod 770 {} \; && sudo find . -type f -exec chmod 660 {} \; && sudo chmod u+x bin/magento
sudo chown -R $(whoami):www-data .
它显示一个向量数组,每个数组[i]都有一个存储在其中的向量,可以遍历许多值。它就像一个链接列表数组,其中磁头只存储在array [i]位置。
<input type="number" name="nome" value="0">
2D矢量和矢量数组之间的区别在于,2D矢量可以跨越大小,而矢量数组的维数可以固定为数组大小。
答案 3 :(得分:5)
在引擎盖下,矢量仍然使用数组,它是特定于实现的,但可以安全地认为:
vector<int>
在内部创建一个int []。
什么向量给你的是它从你那里抽象的部分,如果你想重新调整大小,你不必手动重新分配等,它会为你做这个(当然还有更多)。
当你这样做:vector<vector<int>>
时,你将创建一个向量矢量,意味着一个二维矩阵。您可以根据需要嵌套它。
Vector接受类型T并分配该类型的数组。因此,如果您将向量作为类型T传递,它将有效地执行您在第一行中执行的操作,即vector<int>
数组。
希望它有意义