【问题标题】:How to find the size of array of vectors? or the number of vectors present in the array如何找到向量数组的大小?或数组中存在的向量数量
【发布时间】:2021-07-07 18:27:56
【问题描述】:

在 C++ 中

如果存在一个对象a,它是一个数组,vector<int> a[],我如何获得a的大小? 或者,至少,能够遍历数组?

我希望能够遍历这个所谓的二维矩阵中的所有元素。不知道如何为此实现for 循环。

for(int i = 0; i < ???; i++){
}

a.size() 在这里不起作用。

【问题讨论】:

  • 什么编码语言?
  • 向量 a[],这不是 C++
  • C++ @ravenspoint
  • @DhanyaaBharadwaj 数组是数组。 int、double、vector、SomeReallyBigClass,都一样。
  • @DhanyaaBharadwaj 我在 C++ 中的方法是使用 std::vector 或 std::array。两者都优于常规数组。

标签: c++ arrays vector size traversal


【解决方案1】:

视情况而定。

如果循环在声明数组的同一作用域内,则可以直接确定数组的大小,例如:

{
    ...

    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);

【讨论】:

    【解决方案2】:

    要定义整数的二维矩阵,您需要编写

    std::vector< std::vector< int > > v2d;
    

    要遍历这个你需要

    for( auto& v1d : v2d )
       for( int i : v1d )
    

    【讨论】:

    • 请说明 vector a[] ,即 vector 的数组
    • vector&lt;int&gt; a[] 没有大小,只有当它是函数参数时才会编译。作为函数参数,它是一个数组,has decayed to a pointer 和大小信息已经丢失,因为指针只知道某物在哪里。它不知道那东西有多大。
    • @user4581301 您的评论似乎适用于 OP,而不是这个答案。
    • 我的评论针对上面的评论。
    • @user4581301 如果您的评论是针对其他人的,您应该使用@寻址功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多