代码之家  ›  专栏  ›  技术社区  ›  Christopher Miller

(C++)多维向量中的元素总数[复制]

  •  0
  • Christopher Miller  · 技术社区  · 6 年前

    我了解到检查一维向量的大小是一项简单的任务,因为人们可以

    #include <iostream>
    #include <vector>
    
    int main(){
        vector <int> v = {1, 2, 3, 4};
        cout << v.size() << endl;
        cout << sizeof(v)/sizeof(int) << endl;
    }
    

    正如预期的那样,产出是4。

    但是,当我用多维向量尝试相同的方法时,结果不是我认为正确的:

    #include <iostream>
    #include <vector>
    
    int main(){
        vector <vector<int>> v = {{1, 2}, {3, 4}, {5}}; // 5 elements in total
        cout << v.size() << endl;
        cout << sizeof(v)/sizeof(int) << endl;
    }
    

    这次,输出是3,而不是预期的5。有人能解释一下为什么会发生这种情况,以及如何修改代码以使其产生正确的输出吗?

    2 回复  |  直到 6 年前
        1
  •  3
  •   iBug    6 年前

    在第二个例子中, v 是一个向量 vector<int> s、 所以 v.size() 报告3 子向量 而不是整数的数目。

    std::vector::size() 不递归 ,你必须自己做:

    std::size_t sum = 0;
    for (auto &&i : v) {
        sum += i.size();
    }
    // return sum;
    
        2
  •  2
  •   songyuanyao    6 年前

    您可以编写一个helper函数来递归地计算 多维向量 s。

    template <typename T>
    size_t get_size(const std::vector<T>& v) {
        return v.size();
    }
    template <typename T>
    size_t get_size(const std::vector<std::vector<T>>& v) {
        size_t size = 0;
        for (const auto& vv : v) {
            size += get_size(vv); // get the size recursively
        }
        return size;
    }
    

    LIVE

    顺便说一句: sizeof 给出类型的对象表示的大小,该大小在编译时确定。那又怎么样 sizeof(v) 返回与的元素数无关 v ,这可能不是你想要的。

    推荐文章