【问题标题】:How to get size of a vector from a pointer如何从指针中获取向量的大小
【发布时间】:2020-09-08 02:49:06
【问题描述】:

我有一个带有向量指针的类模板,我需要编写一个 size() 函数来返回指向向量的大小。

目前我的size() 无法正常工作,我不知道为什么。

firstView 的大小不等于指向的向量。

#include <vector>

struct functor {

    int operator()(int i) const {
        return i;
    }
};

template<typename T, typename Function> class view {
    const std::vector<T>* vectT;
    Function functor{};

public:

    view(const std::vector<T> vect) {
        vectT = &vect;
    }

    int size() const {      
        return vectT->size();
    }
};

int main() {
   std::vector<int> v;
   v.push_back(1);
   v.push_back(2);
   v.push_back(3);
   v.push_back(4);

   view<int, functor> firstView(v);
   std::cout << firstView->size();
}

【问题讨论】:

    标签: c++ pointers templates vector size


    【解决方案1】:

    您忘记通过引用传递。与

    view(const std::vector<T> vect) {
        vectT = &vect;
    }
    

    您制作了一个副本,并且您的指针指向该副本,该副本在构造函数结束后立即被销毁。使用类似的参考

    view(std::vector<T>& vect) {
        vectT = &vect;
    }
    

    将意味着您的指针指向您传递给构造函数的向量。

    【讨论】:

      【解决方案2】:

      std::cout &lt;&lt; firstView-&gt;size();有错别字,应该是std::cout &lt;&lt; firstView.size();

      乍一看,一切都很好,您描述的问题无法重现:

      https://godbolt.org/z/MPCDuq.

      Output: 4

      但是,在优化编译中,问题变得很明显:

      https://godbolt.org/z/upeGq9 优化-O3

      Output: 1049747

      v 作为副本传递时会发生什么,在优化版本中,该副本被销毁并且比正常版本更早变得不可访问,因此在size() 中,您正在访问相当于未初始化指针的内容。

      这可以通过引用传递向量来轻松解决:

      view(const std::vector<T>& vect){/*...same...*/}
      

      https://godbolt.org/z/soX36k 优化-O3

      Output: 4

      这更好,不仅因为它解决了与访问对象过早销毁相关的问题,还因为您避免了不必要的复制。

      正如您在程序集中看到的那样,这使您的程序更加灵活,尽管这只有在较大的程序中才能真正明显。

      【讨论】:

        猜你喜欢
        • 2014-08-21
        • 1970-01-01
        • 1970-01-01
        • 2012-10-09
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多