如何从函数返回向量引用?

Posted

技术标签:

【中文标题】如何从函数返回向量引用?【英文标题】: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);

【问题讨论】:

只返回一个值。在这种情况下返回引用是没有意义的。 how to "return an object" in C++的可能重复 @juanchopanza 在这种情况下不是,但在很多情况下这是有意义的。 你尝试的不是一个好主意,因为不应该返回对局部变量的引用。 如果你想这样做,你需要将向量作为函数的引用参数,并传递一个向量来存储函数外部的结果。记得先清除向量。这可以让您重用相同的向量,这在某些情况下可能会更高效。 【参考方案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】:

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

【讨论】:

以上是关于如何从函数返回向量引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过引用返回一个向量,隐含地期望一个空向量作为输入?

如何从返回向量的函数中获取向量值?

如何实现从模板参数返回向量的模板函数?

C++,成员函数返回对包含指向 const 对象的指针的向量的 const 引用

为啥可以从函数返回“向量”?

如何从 C++ 中的函数返回向量?