保持数据迭代器的向量

时间:2015-11-12 16:03:22

标签: c++ pointers c++11 vector iterator

我有一个功能:

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. 其他??
  5. 修改

    我将如何处理good_items? 很多事情......其中之一是从矢量中删除它们并将它们保存在其他地方。也许别的什么后来

    编辑2:

    对我来说最重要的一点是,根据data的结构,如何快速访问good_items中的项目?

    编辑3:

    我刚才认为我的想法是错的。保持原始指针(或智能)作为向量的项目不是更好,所以我可以保持向量的实际值(这是指针),我不怕重复,因为它们只是指针?

4 个答案:

答案 0 :(得分:4)

如果您从原始矢量中删除项目,则列出的每种方法都会出现问题。

如果您将项目添加到原始矢量,第二个和第三个将有问题。如果您使用push_back添加项目,则第一个不会成为问题。

如果你不修改原始载体,所有这些都没问题。

鉴于此,我建议使用std::vector<size_t>

答案 1 :(得分:2)

如果您打算删除满足谓词的元素,那么erase-remove惯用法是最简单的解决方案。

如果您打算复制这些元素,那么std::copy_if是最简单的解决方案。

如果你打算最后得到容器的两个分区,即一个容器有好的容器,另一个容器有坏容器,那么std::partition_copy是个不错的选择。

为了通常允许迭代这些元素,一个有效的解决方案是返回一系列这样的迭代器,它将在迭代时检查谓词。我不认为标准库中有这样的迭代器,所以你需要自己实现它们。幸运的是,已经为你做了这件事:http://www.boost.org/doc/libs/release/libs/iterator/doc/filter_iterator.html

答案 2 :(得分:2)

我会选择std::vector<size_t>std::vector<T*>,因为它们更容易输入。否则,这三个向量几乎相同,它们都识别元素的位置。

如果您知道限制,可以使

std::vector<size_t>使用较小的索引类型。

如果您希望此向量中有许多元素,您可能会考虑使用boost::dynamic_bitset来节省内存并提高CPU缓存利用率。每个元素位,位位置是原始向量的索引。

答案 3 :(得分:0)

根据我的理解,你要解决的问题是两组的交集,我会从标准库中寻找解决方案:std::set_intersection