【问题标题】:Change from static array to vector从静态数组变为向量
【发布时间】:2014-03-14 00:34:19
【问题描述】:

这是我的代码:

vector<int> Edge[1000000]; //size of array must be very high

scanf("%d%d",&N,&M );
//N = size of workable index numbers for Edge
for( i=1;i<=M;i++){

    scanf("%d%d",&u,&v );
    Edge[u].push_back( v );
}

但正如您所见,它是一个静态向量数组。 如果我把它改成这样:

vector<vector<int>> Edge;

对于循环和回退,我该如何做到这一点?我需要创建一个 N+1 大小的向量,每个位置也是一个向量。

【问题讨论】:

  • vector&lt;vector&lt;int&gt;&gt; Edge(100000);vector&lt;vector&lt;int&gt;&gt; Edge; Edge.resize(100000);
  • 我需要在声明后初始化,因为它是一个全局变量
  • 即使变量是全局的也依然有效。
  • 你的意思是你声明变量的时候还不知道大小?
  • 原来如此,谢谢

标签: c++ arrays vector


【解决方案1】:

我需要创建一个N+1大小的向量,每个位置也是一个向量。

考虑到你在编译时就知道外部容器的大小,你也可以使用std::array来存储向量:

std::array<std::vector<int>, N + 1> Edge;

如果您在编译时不知道大小,可以使用:

std::vector<std::vector<int>> Edge;

但作为一般经验法则,倾向于避免使用向量的向量,因为它们通常不能很好地工作。

【讨论】:

  • 在此之前我同意:“倾向于避免使用向量的向量,因为它们通常不能很好地工作”。
  • @PaulDraper,最好也说出原因。
【解决方案2】:

您可以通过将 int 传递给它们的构造函数来构造给定大小的向量。然后,您可以使用循环来初始化子向量。

int size;
vector<vector<int>> Edge(size); //Initializes Outer Array to have 'size' elements

for(auto i:Edge)
{
    // i is a vector within Edge
}

优点是您不必反击。如果您仍想按顺序 push_back(不必跟踪迭代器/int),您可以改用 vector.reserve()。

【讨论】:

    猜你喜欢
    • 2020-07-13
    • 2015-09-23
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2018-02-24
    相关资源
    最近更新 更多