【问题标题】:How to return a vector reference from a function?如何从函数返回向量引用?
【发布时间】:2014-04-14 11:49:23
【问题描述】:

我正在尝试从函数返回一个向量。但是如果我返回整个向量,那么复制过程会花费额外的时间,所以我试图只返回对向量的引用。我如何在 C++ 中做到这一点?这是我目前的功能,

vector<ii>& primeFactors(int n)
    {
        int i;
        vector<ii> factors;
        for(i=0; i<=n && n!=1 ; ++i)
        {
            int cnt = 0;
            while((n%primes[i]) == 0)
            {
                ++cnt;
                n/=primes[i];
            }
            if(cnt!=0)
                factors.push_back({primes[i],cnt});
        }
        if(i == lim)
            factors.push_back({n,1});



        return factors;
    }

这是我在 main() 中的调用

vector<ii> factors = primes.primeFactors(20);

【问题讨论】:

  • 只返回一个值。在这种情况下返回引用是没有意义的。
  • @juanchopanza 在这种情况下不是,但在很多情况下这是有意义的。
  • 你尝试的不是一个好主意,因为不应该返回对局部变量的引用。
  • 如果你想这样做,你需要将向量作为函数的引用参数,并传递一个向量来存储函数外部的结果。记得先清除向量。这可以让您重用相同的向量,这在某些情况下可能会更高效。

标签: c++ algorithm vector


【解决方案1】:

但是如果我返回整个向量,那么复制过程会花费额外的时间,所以我试图只返回对向量的引用。

别担心。编译器将通过RVO(返回值优化)优化调用并忽略副本。只需按值返回向量:

std::vector<ii> primeFactors(int n) { … }

【讨论】:

    【解决方案2】:

    正如其他人所说,您应该只返回向量。

    但如果出于某种原因您真的想要返回一个引用,您必须确保它在退出函数后“存在”。这不是在您的代码中使用局部变量的情况。

    相反,您可以将函数包装在一个类中,并将向量作为成员:

    class PrimeFactorCalculator
    {
    public:
        std::vector<ii>& primeFactors(int n)
        {
            // ...
    
            return m_resultVector;
        }
    
    private:
        std::vector<ii> m_resultVector;
    };
    

    【讨论】:

      【解决方案3】:

      您可以只返回向量的值,也可以通过引用将向量作为参数传递给函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-06
        • 1970-01-01
        • 1970-01-01
        • 2017-04-07
        • 1970-01-01
        • 1970-01-01
        • 2020-09-17
        相关资源
        最近更新 更多