2014-12-03 60 views
1

我遇到了一些向量返回值爲空的問題。以下是基本設置:向量返回空C++

//Foo.h 
struct Foo{ 
    int n; 
    double vals[2]; 
}; 

//MyClass.h 
class MyClass{ 
private: 
    std::vector<Foo> classVector; 
public: 
    std::vector<Foo> getPair(int i1, int i2); 
}; 

//MyClass.cpp 
std::vector<Foo> MyClass::getPair(int i1, int i2) 
{ 
    std::vector<Foo> toReturn(2); 
    toReturn[0] = classVector[i1 - 1]; 
    toReturn[1] = classVector[i2 - 1]; 
    return toReturn; 
} 

classVector是一個已經初始化並且包含數據的向量。我基本上只是試圖從該向量中獲取兩個值,並使用此函數返回它們。但是,當我調用返回值時,在調試模式下返回時,大小將重置爲零,並且已複製過的元素(我在返回調用之前檢查過)不再位於向量中。

我有一種感覺,它必須做一個淺拷貝被傳回來。我嘗試爲Foo創建自己的拷貝構造函數,但是當它沒有解決問題時我刪除了它。

+1

'返回的std ::矢量(classVector.begin(),classVector.begin()+ 2);' – Borgleader 2014-12-03 21:39:34

+1

@Borgleader坦率地說,'返回make_pair (...' – 2014-12-03 21:40:02

+0

我會嘗試make_pair。另一個建議不起作用,因爲元素不一定是按順序排列的 – ewpcasey 2014-12-03 21:41:27

回答

1

編譯器將優化您的代碼,以便將vector返回給調用者的向量。

所以,如果您有:回報稱爲getPair

void someFunc(MyClass& my) 
{ 
    vector<Foo> answer = my.getPair(3,4); 
} 

後,「toReturn」現在生活在「答案」和「toReturn」的內容將是空的。當函數即將返回時,不可能再使用'toReturn',因此不需要保留其內容。對於'回答'矢量來說,只需抓住'toReturn'矢量的內涵,而不是在'answer'中創建新元素並從'toReturn'中複製每個元素,效率更高。

對於移動語義的說明,請參見此處:What are move semantics?