【问题标题】:array of vectors or vector of arrays?向量数组还是数组向量?
【发布时间】:2016-05-31 19:09:07
【问题描述】:

我是 C++ STL 的新手,无法理解图形表示。

vector<int> adj[N];

那么这会创建一个向量类型的数组还是创建一个数组向量? BFS 代码似乎遍历了 adj[i] 的每个实例中存在的值列表,因此它看起来就像一个向量数组。 创建向量的语法是:

vector<int> F;

这将有效地创建一维向量 F。

有什么区别

vector< vector<int> > N; 

vector<int> F[N]

【问题讨论】:

  • 尝试从从右到左阅读。在这种情况下,它变成了向量数组。
  • int x[N];int 的数组; vector&lt;int&gt; y[N];vector&lt;int&gt; 的数组。
  • 请记住,对于任何定义为T name[N] 的数组,您都有一个数组name,其中N 元素类型为T。另外,当我们讨论数组时,std::array&lt;T, N&gt;T name[N] 形式的数组的容器,就像std::vector&lt;T&gt;T 类型的可变长度数组的容器一样。

标签: c++ arrays vector


【解决方案1】:

这(vector&lt;int&gt; adj[N];)是创建一个向量类型的数组还是创建一个 数组向量?

它创建向量数组

有什么区别

vector< vector<int> > N; 

vector<int> F[N]

在第一种情况下,您正在创建一个动态数组的动态数组(向量的向量)。每个向量的大小可以在运行时更改,所有对象都将在堆上分配。

在第二种情况下,您正在创建一个固定大小的向量数组。您必须在编译时定义N,并且所有向量都将放在堆栈上,但是,每个向量都会在堆上分配元素。

我总是更喜欢向量的向量情况(或矩阵,如果你可以使用第三方库),或者std::arrays 的std::array 以在编译时大小的情况下。

我是 C++ STL 的新手,无法理解图表 表示。

您也可以将图形表示为std::unordered_map&lt;vertex_type,std::unordered_set&lt;vertex_type&gt;&gt;,其中vertex_type 是顶点的类型(在您的情况下为int)。当边数不是很大时,可以使用这种方法来减少内存使用量。


:准确地说 - 并不总是在堆栈上 - 它可能是堆上复杂对象的一部分。而且,C++标准并没有对栈和堆定义任何要求,只提供了对存储时长的要求,如自动、静态、线程或动态。

【讨论】:

  • 不想挑剔但vector&lt;int&gt; F[N]不一定在堆栈上分配F。这取决于上下文。
  • @MohamadElghawi,您的意思是自动/动态存储吗?
  • 例如:它可以有静态存储持续时间,如果它在一个被更新的对象中,甚至可以放在堆中。
  • 不,在这种情况下它不提供任何好处。正如我已经说过的,它可以用来减少内存使用,因为邻接矩阵占用 N^2 内存,其中 N 是顶点数。
  • @thematroids,“这不应该影响遍历顺序”——只要你填充了图表并且不修改它。
【解决方案2】:

简答:
这是vector &lt;int&gt;s 的数组。

长答案:
在阅读诸如

之类的声明时
vector<int> adj[N];

编译器使用一种称为“螺旋-”“顺时针-规则” 的方法来解释其含义。螺旋规则背后的想法是,您从变量名称开始,然后以顺时针螺旋的方式向外移动,以确定它是什么类型的变量。例如:

char* str [10];

可以这样解释:

        ____
       |    |
char* str [10];
  |_________|


str 设为 10 个 char*s 的数组。

因此,vector&lt;int&gt; adj[N]; 是向量数组而不是数组向量



熟能生巧:

1:int * foo [ ]; 是什么意思?

答案:

"foo" 是一个指向整数的指针数组


2:int * (*foo [ ] )();是什么意思?

答案:

"foo" 是一个指向返回整数指针的函数的指针数组


3:int * (*(*foo [ ] )())();是什么意思?

答案:

"foo" 是一个指向函数的指针数组,返回指向函数的指针,返回指向整数的指针

【讨论】:

  • 抱歉没有直接发图。不幸的是,我还没有所需的声誉。
  • 这种解释将永远改变我对变量声明的看法,这是非常有用的信息。我以前总是搞乱声明。谢谢@Chef Cyanide。
  • @HarshaJK 没问题!很高兴我能帮忙:)
【解决方案3】:
vector<int> arr[N];

它显示一个向量数组,每个 array[i] 都会有一个向量存储在其中,可以遍历许多值。它就像一个链表数组,其中头部仅存储在 array[i] 位置。


vector<vector<int> > N vs vector<int> F[N]

2D 向量和向量数组之间的区别在于,2D 向量的大小可以跨越,而向量数组的维度固定为数组大小。

【讨论】:

  • 而且向量是一个标准的 C++ 库容器(也是一个std::array),允许使用迭代器、算法等,而简单的数组只是一个低级数据结构没有包装也没有好吃的东西。首先首选高级编程,其次首选低级编程 - std::arraystd::vector 的实现确实使用数组...
  • @SergeBallesta 你可以对原始数组使用迭代器和算法,例如使用全局 beginend 函数。
【解决方案4】:

在底层向量仍然使用数组,它是特定于实现的,但可以安全地认为:

vector<int>

在内部创建一个 int[]。 向量给您的是它从您那里抽象出如果您想重新调整大小而不必手动重新分配等的部分,它会为您做到这一点(当然还有更多)。 当您这样做时:vector&lt;vector&lt;int&gt;&gt; 您将创建一个向量向量,即二维矩阵。您可以随意嵌套它。 Vector 接受类型 T 并分配该类型的数组。因此,如果您将向量作为类型 T 传递,它将有效地执行您在第一行中所做的事情,即vector&lt;int&gt; 的数组。 希望有意义

【讨论】:

    猜你喜欢
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2020-02-24
    相关资源
    最近更新 更多