鉴于这两个声明:
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
答案 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?或者s
和v
被初始化的事实
第二个元素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)
。