为什么vector <int> []和vector <vector <int>&gt;似乎行为相同?</vector <int> </int>

时间:2013-03-07 08:17:12

标签: c++ stl stdvector

鉴于这两个声明:

vector<int> list[N];

vector<vector<int>> list;

为什么列表[1] .push_back(2);适用于两者?理论上第一个是一维数组,第二个是二维数组。 (纠正我,如果我错了)?但令我惊讶的是,我发现列表[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 个答案:

答案 0 :(得分:4)

如果有效,因为你声明了一个数组的向量。

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

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

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

答案 1 :(得分:2)

两种声明都有点相似:第一种是C风格 int的向量数组,第二个是向量的向量 INT。索引时,C样式数组和向量表现出来 类似地:表达式list[1].push_back(2)使用索引 在外部容器(C样式数组或向量),它的工作原理 对彼此而言。

话虽如此,之间的重要区别 两个声明。第一个(vector<int> list[N])创建 一个C样式的 N 向量数组;生成的容器有 一个恒定的大小,永远不会改变。第二 (vector<vector<int> > list;)创建一个空向量 vector:list中有 no 元素,以及 索引到它是未定义的行为。另一方面,你 可以在内存允许的情况下动态扩展它。

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

另外:是否处理C样式数组向量 永远不应该使用用户提供的值索引它们 没有先检查值是否在范围内。你是 代码充满了未定义的行为,具体取决于输入。 格式也很糟糕。并使用逗号运算符 在for中放置两个语句而不使用{...} 可怕。你可能应该将其分解为几个 功能。神奇数字的意义是什么? 100100?或者sv被初始化的事实 第二个元素1,以及所有其他元素0。

答案 2 :(得分:1)

使用

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

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

使用

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

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

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

答案 3 :(得分:1)

std::vector有一个构造函数,它接受一个大小的参数,默认构造了许多对象。

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