-4

鉴于这两个声明:

vector<int> list[N];

vector<vector<int>> list;

为什么 list[1].push_back(2); 两者都适用?理论上第一个是一维数组,第二个是二维数组。(如果我错了,请纠正我)?但令我惊讶的是,我发现 list[1].push_back(2) 两者都适用。

谁能解释这是怎么发生的?

请解释,问候和感谢

`

 #include <cstdio>
 #include <vector>
 using namespace std;
 int main(void) {
  vector<int>g[100100];
  int n,m,k;
  scanf("%d%d%d",&n,&m,&k);
  for(int i=0,a,b;i<m&&2==scanf("%d%d",&a,&b);++i)g[a].push_back(b),g[b].push_back(a);
  int s[100100]={0,1},v[100100]={0,1};
  for(int u=0;;++u){
    int a=s[u];
    for(int i=g[a].size();i-->0;){
      int b=g[a][i];
      if(v[b]){
        if(u-v[b]>=k){
          printf("%d\n",u-v[b]+1);
          for(int j=v[b];j<=u;++j)printf("%d ",s[j]);
          return 0;
        }
      }
      else{
        s[v[b]=u+1]=b;
        break;
      }
    }
  }
}

`

此代码用于查找长度超过“K+1”的循环,这是我正在研究的一个问题..您可以通过示例输入和输出自行检查

input
3 3 2
1 2
2 3
3 1
output
3
1 2 3 
4

4 回答 4

4

如果有效,因为您要声明一个向量数组

如果你想要一个特定大小的向量,你需要将大小传递给构造函数:

std::vector<int> g(size);

但是,请注意,push_back对上面声明的向量执行 a 会在添加值时增加大小。

于 2013-03-07T08:26:03.463 回答
2

这两个声明有点相似:第一个是 C 风格的 int 向量数组,第二个是 int 向量的向量。索引时,C 样式数组和向量的行为相似:表达式list[1].push_back(2)使用外部容器(C 样式数组或向量)上的索引,这对两者都有效。

话虽如此,这两个声明之间存在重要区别。第一个 ( vector<int> list[N]) 创建一个包含N个向量的 C 样式数组;生成的容器具有恒定的大小,永远无法更改。第二个 ( vector<vector<int> > list;) 创建一个空的向量向量:开始时没有元素,list对它的索引是未定义的行为。另一方面,您可以在内存允许的范围内动态扩展它。

作为一般规则,您应该避免使用 C 样式的数组。特别是作为局部变量,尤其是在元素数量相当大的情况下。即使在 C 中也是如此,因为堆栈大小通常是有限的。

另外:无论是处理 C 风格的数组还是向量,在没有首先检查值是否在范围内之前,您都不应该使用用户提供的值对它们进行索引。您的代码充满了未定义的行为,具体取决于输入。格式也很差。并且使用逗号运算符将两个语句放在 a 中for而不使用{...}是可怕的。您可能应该将其分解为几个功能。神奇数字 100100 的含义是什么?或者使用第二个元素 1 和所有其他元素 0 初始化sand的事实。v

于 2013-03-07T09:07:46.557 回答
1

vector<int> list[1];
list[0].push_back(2);

您正在将 a 推回int(2)名为 的数组的第 0 个元素中list

vector< vector<int> > list[1];
list[0].push_back(2);

您正在将 a 推回到vector<int>(2)名为 的数组的第 0 个元素中list。您要推回的元素是一个初始大小为 2 的整数向量。

vector<T>(size_t)注意:如果是,则不会发生这种情况explicit vector<T>(size_t)

于 2013-03-07T08:21:18.587 回答
1

std::vector有一个构造函数,它接受一个大小参数,并默认将许多对象构造到其中。

对于 C++ 11,这个构造函数是显式的,但我猜你正在 C++ 98 模式下编译,在这种情况下,推1vector<vector<int> >list将导致1被隐式转换为vector<int>(1).

于 2013-03-07T08:22:58.690 回答