首頁>Program>source

从頭開始設計新系統.我將使用STL儲存某些长期存在的物件的列表和地圖。

問题:我應该確保我的物件具有副本構造函式並將物件的副本儲存在我的STL容器中,還是通常更好地自己管理生命和作用域並仅將指向這些物件的指標儲存在我的STL容器中?

我意識到這在细节上有些不足,但是我正在尋找"理論上"的更好答案,因為我知道這两種解決方案都是可行的。

使用指標有两个非常明顯的缺點: 1)我必须自己在STL之外的範圍內管理這些物件的分配/取消分配。 2)我無法在堆棧上建立一个臨時物件並將其添加到我的容器中。

還有其他我想念的东西吗?

最新回復
  • 5月前
    1 #

    因為人们對使用指標的效率产生了兴趣。

    如果您正在考虑使用std :: vector,並且更新很少,並且您经常對集合进行迭代,並且它是一種非多型型別,則儲存物件"副本"会更有效,因為您可以获得更好的引用位置 .

    Otoh,如果更新是常见的儲存指標,則將节省複製/重定位成本.

  • 5月前
    2 #

    這確實取決於您的情况。

    如果您的物件很小,並且可以很轻松地複製物件,那麼在我看来,將資料儲存在stl容器中非常簡單,而且易於管理,因為您不必担心生命週期管理。

    如果物件很大,並且没有預設的構造函式,或者物件的副本很昂贵,那麼使用指標儲存可能是解決方法。

    如果決定使用指向物件的指標,請查看Boost指標容器庫.這个boost庫包裝了所有STL容器,以用於動態分配的物件。

    每个指標容器(例如ptr_vector)在將物件添加到容器時都拥有该物件的所有權,並為您管理這些物件的生存期.您還可以通過引用訪問ptr_容器中的所有元素.這樣您就可以做

    class BigExpensive { ... }
    // create a pointer vector
    ptr_vector<BigExpensive> bigVector;
    bigVector.push_back( new BigExpensive( "Lexus", 57700 ) );
    bigVector.push_back( new BigExpensive( "House", 15000000 );
    // get a reference to the first element
    MyClass& expensiveItem = bigList[0];
    expensiveItem.sell();
    

    這些類包裝了STL容器,並可以使用所有STL演算法,這非常方便。

    還有一些用於將容器中的指標的所有權轉移到呼叫者的工具(通過大多數容器中的釋放功能)。

  • 5月前
    3 #

    如果要儲存多型物件,則始终需要 使用基類指標的集合.

    也就是說,如果您打算在集合中儲存其他派生型別,則必须儲存指標或被切片守護程序吃掉。

  • 5月前
    4 #

    抱歉,事件發生後三年內跳轉,但請註意 在這裏...

    在我的最後一个大專案中,我的中央資料結構是一組相当簡單的物件.隨着需求的發展,进入專案大約一年後,我意識到该物件實際上需要是多型的.经過數週的艰苦而艰苦的脑部手術,將資料結構固定為一組基類指標,並處理了物件儲存,投射等中的所有附帶损害.我花了几个月的時間才能使自己確信新代碼正在執行.順便說一句,這使我难以思考C ++物件模型的設計得如何。

    在我当前的大型專案中,我的中央資料結構是一組相当簡單的物件.在进入專案大約一年後(恰好是今天),我意識到该物件實際上需要是多型的.迴到網上,找到了该執行緒,並找到了Nick到Boost指標容器庫的鏈接.這正是我上次要修複所有問题時要寫的內容,因此這次我会尝試一下。

    無論如何,對我而言,這是道德上的問题:如果您的規格不是100%固定不變,那就去找个指標,這樣一来,您以後就可以节省很多工作。

  • 5月前
    5 #

    為什麼不明白 两全其美:做一个智慧指標容器(例如 boost::shared_ptrstd::shared_ptr ).您不必管理記憶體,也不必處理大型複製操作。

  • c#:web Api的Xml文件如何包含主專案之外的文件?
  • exception:android视圖未附加到視窗管理器