2017-06-01 23 views
0

嘿傢伙?我是新來的整個C++標準庫的東西,但對於我的魔鬼,我無法弄清楚爲什麼這個程序沒有給我我希望的輸出。C++矢量和函數 - 無法讓程序工作。需要幫助,

#include <iostream> 
#include <vector> 
#include <iterator> 

/* 
create_vec should initialise my vector and return an iterator pointing to 
it. 
*/ 
template <typename s> 
    typename std::vector<s>::iterator create_vec(s var) { 
    std::vector<s> tempVec; 
    tempVec.push_back(var); 
    auto itr = tempVec.begin(); 
    return itr; 
} 

int main() { 
    std::vector<int>::iterator itr = create_vec<int>(148); 
    std::cout << *itr << "was passed." << std::endl; 
    return 0; 
    } 

O/P:0被傳遞到創建VEC功能

P.S忽略所有的std的。我想知道在每個時刻我得到每種類型,功能等。

+0

是否有任何理由不能簡單地在main中創建一個std :: vector?這是爲了練習嗎? – synchronizer

+0

不相關,但你使用'std ::'前綴是好的。我*從不*使用'使用名稱空間標準',而是使用名稱空間前綴。 –

+0

是的,這是爲了練習。 –

回答

1

變量tempVeccreate_vec函數中的本地。當函數返回時,矢量對象被破壞,讓你的迭代器不再存在。當您嘗試使用迭代器時,會導致未定義的行爲

是不是create_vec函數返回的目的是而不是?函數的名稱表明它應該這樣做。

+0

有關附加說明,要返回向量,可以返回std :: move(tempVec),但我想知道是否有編譯器優化使std :: move不必要。 – synchronizer

+1

@synchronizer [Copy elision](http://en.cppreference.com/w/cpp/language/copy_elision)就是這樣一種優化。 –

+0

通過返回矢量,我想我會創建它的另一個副本。我認爲,這將是低效率的,因此迭代器被返回。有沒有什麼方法可以使用這個功能,而且效率不高,但它可能不合理? –