2016-07-01 108 views
0

我有一個向量std::vector<MyClass> myclass_vec(10),有10個初始化對象MyClass。現在我想遍歷這個向量並存儲對另一個向量中的每個MyClass對象的引用std::vector<MyClass> myclass_vec_refs。我之所以想要存儲引用是因爲我不必複製對象,顯然,請參閱與myclass_vec中相同的對象。如何從C++中的另一個矢量中的一個矢量中存儲對象的引用?

出於某種原因,這不符合預期。我必須像這樣申報std::vector<&MyClass> myclass_vec_refs嗎?

正如我正在查看其他問題,我在這裏看到有關std::unique_ptr。如果我更改std::vector<std::unique_ptr<MyClass>> myclass_vec(10),那麼我將無法在myclass_vec_refs中擁有參考或指針,因爲它們被聲明爲唯一的。請糾正我,如果我錯了。

另一種方法是使用std::shared_ptr。由於它擁有一個參考計數器,因此我可以讓myclass_vec_refs指向myclass_vec中的對象,但是我讀到這會引入相當多的開銷,share_ptr應僅用作最後的手段。

我也不知道是否引用像我試圖解決。如果myclass_vec中的對象被刪除,會發生什麼情況? myclass_vec_refs矢量的大小是否爲-1,因爲該對象不再存在,還是僅指向錯誤的內存?

難道emplace_back可能是myclass_vec_refs載體中的參考嗎?由於這創造了對象就地,我想這不起作用,只有push_back可以使用?

+0

爲什麼不只是存儲一個迭代器中的其他載體? – NathanOliver

+3

爲什麼不存儲指針而不是分配的對象? –

+3

爲什麼不存儲索引呢? –

回答

1

不能作爲參考矢量。 爲什麼?

引用必須始終引用實際對象,並且引導設計必須能夠爲您動態創建「空」對象(即默認構造函數)。

然而,你可以創建一個指針向量。

如果其他矢量以任何方式修改,指針將變爲無效。 如果這對您是個問題,請使用地圖設置

+1

確實,你不能有引用的向量,但你的推理是錯誤的。向量不要求該對象是默認可構造的。儘管vector的某些成員函數(至少'resize(size_type count)'和'vector(size_type count)'是這樣),但是你不必使用這些函數來使用vector。 – user2079303

+1

@ user2079303:實際上,'vector'不需要那個。或者更重要的是,'vector' * alone *不強制複製/移動要求。 「矢量」的方法實際上是插入/移除強加該要求的項目。 'vector '的基本要求是'T',通過分配器的'destroy'函數可擦除。而對於'std :: allocator',引用不是。 –

+0

@NicolBolas哦,我犯了同樣的錯誤,我在第一時間進行了糾正。 – user2079303

1

由於這裏回答:Strange Template Deduction

的技巧是使用std::reference_wrapper<>

#include <algorithm> 
#include <iostream> 
#include <vector> 

template<typename container_ty_, class Comp> 
auto where(container_ty_& V, Comp&& comp) 
{ 
    using value_type = typename container_ty_::value_type; 
    using reference = 
    std::conditional_t< 
     std::is_const<container_ty_>::value, 
     std::reference_wrapper<const value_type>, 
     std::reference_wrapper<value_type> 
    >; 

    std::vector<reference> cursor; 

    for(auto& VAL : V) 
     if(comp(VAL)) 
      cursor.push_back(VAL); 

    return cursor; 
} 

int main(int argc, char** argv) { 
    std::vector<int> tVect = {0, 5, 2, 1, 7, 9}; 

    //Why must std::vector<int> be passed... 
    auto vec = where(tVect, [](const int& V) -> bool { return V > 5; }); 

    std::for_each(vec.begin(), vec.end(), [] (int& v) { std::cout << v++ << std::endl; }); 
    std::cout << std::endl; 
    std::for_each(tVect.begin(), tVect.end(), [](const int& v) { std::cout << v << std::endl; }); 
} 
+0

@Sean M .:這是你所有問題的真正答案! – Roland

相關問題