在C++中
如果存在一个对象a
,它是一个数组vector<int> a[]
,我如何获得a
的大小或者,至少,能够遍历数组
我希望能够遍历这个所谓的2D矩阵中的所有元素。不知道如何实现for
循环。
for(int i = 0; i < ???; i++){
}
a.size()
在此不起作用。
这取决于情况
如果循环与声明数组的范围相同,则可以直接确定数组的大小,例如:
{
...
vector<int> a[SomeSize];
for(size_t i = 0; i < SomeSize; ++i){ // OK!
...
}
for(size_t i = 0; i < sizeof(a) / sizeof(*a); ++i){ // OK!
...
}
for(size_t i = 0; i < std::size(a); ++i){ // OK!
...
}
for(auto iter = std::begin(a); iter != std::end(a); ++iter){ // OK!
...
}
for(auto &elem : a){ // OK!
...
}
...
}
另一方面,如果数组被传递给一个函数,那么只有当数组是通过引用传递的,或者如果大小是作为一个单独的参数明确传递的,才有可能确定数组的大小,例如:
void func1(vector<int> a[]) // same as 'vector<int>* a'
{
for(size_t i = 0; i < sizeof(a) / sizeof(*a); ++i){ // NOPE, can't work!
...
}
for(size_t i = 0; i < std::size(a); ++i){ // NOPE, can't work!
...
}
for(auto iter = std::begin(a); iter != std::end(a); ++iter){ // NOPE, can't work!
...
}
for(auto &elem : a){ // NOPE, can't work!
...
}
}
void func2(vector<int> *a, int size)
{
for(size_t i = 0; i < size; ++i){ // OK!
...
}
for(auto iter = a; iter != a + size; ++iter){ // OK!
...
}
for(auto iter = std::begin(a); iter != std::end(a); ++iter){ // NOPE, can't work!
...
}
for(auto &elem : a){ // NOPE, can't work!
...
}
*/
}
template<size_t N>
void func3(vector<int> (&a)[N])
{
for(size_t i = 0; i < N; ++i){ // OK!
...
}
for(size_t i = 0; i < sizeof(a) / sizeof(*a); ++i){ // OK!
...
}
for(size_t i = 0; i < std::size(a); ++i){ // OK!
...
}
for(auto iter = std::begin(a); iter != std::end(a); ++iter){ // OK!
...
}
for(auto iter = a; iter != a + N; ++iter){ // OK!
...
}
for(auto &elem : a){ // OK!
...
}
}
vector<int> a[SomeSize];
func1(a);
func2(a, SomeSize);
func2(a, std:size(a));
func3(a);
要定义二维整数矩阵,需要编写
std::vector< std::vector< int > > v2d;
要穿过这个,你需要
for( auto& v1d : v2d )
for( int i : v1d )
我不知道它是否仍然有用。但由于你只需要遍历它来解决gfg问题,你只需要访问你需要的索引位置,只要你的解决方案是正确的,你就不会越界。
例如,如果给你一个相邻列表,一个图的vector<int> adj[]
和顶点数V
,你可以访问任何你需要的索引,它就会在那里。您不需要遍历整个范围。这只是关于GFG问题的制作方式。