簡體   English   中英

保持數據迭代器的向量

[英]Keeping vector of iterators of the data

我有一個功能:

void get_good_items(const std::vector<T>& data,std::vector<XXX>& good_items);

這個函數應該檢查所有資料后,發現滿足條件和回報,他們是在good_items項目。

什么是最好的而不是std::vector<XXX>

  1. std::vector<size_t>包含所有好的索引。
  2. std::vector<T*>包含指向項目的指針。
  3. std::vector<std::vector<T>::iterator> ,包含項的迭代器。
  4. 其他?

編輯:

我將如何處理good_items 很多事情......其中之一是從矢量中刪除它們並將它們保存在其他地方。 也許晚些時候

編輯2:

對我來說最重要的一點是,如何根據good_items的結構快速訪問data的項目?

編輯3:

我剛才認為我的想法是錯的。 保持原始指針(或智能)作為向量的項目不是更好,所以我可以保持向量的實際值(這是指針),我不怕重復,因為它們只是指針?

如果從原始矢量中刪除項目,則列出的每種方法都會出現問題。

如果您將項目添加到原始矢量,第二個和第三個將是有問題的。 如果您使用push_back添加項目,第一個將不會是一個問題。

如果不修改原始矢量,所有這些都可以。

鑒於此,我建議使用std::vector<size_t>

如果您打算刪除滿足謂詞的元素,那么erase-remove慣用法是最簡單的解決方案。

如果您打算復制這些元素,那么std::copy_if是最簡單的解決方案。

如果你打算最后得到容器的兩個分區,即一個容器有好的容器,另一個容器有壞容器,那么std::partition_copy是個不錯的選擇。

為了通常允許迭代這些元素,一個有效的解決方案是返回一系列這樣的迭代器,它將在迭代時檢查謂詞。 我不認為標准庫中有這樣的迭代器,所以你需要自己實現它們。 幸運的是,已經為你完成了這項工作: http//www.boost.org/doc/libs/release/libs/iterator/doc/filter_iterator.html

我會選擇std::vector<size_t>std::vector<T*>因為它們更容易輸入。 否則,這三個向量幾乎相同,它們都識別元素的位置。

如果您知道限制,則可以使std::vector<size_t>使用較小的索引類型。

如果您希望此向量中有許多元素,您可能會考慮使用boost::dynamic_bitset來節省內存並提高CPU緩存利用率。 每個元素一位,位位置是原始矢量的索引。

根據我的理解,你要解決的問題是兩組的交集,我會從標准庫中找到解決方案: std :: set_intersection

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM