保持数据迭代器的矢量



我有一个函数:

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

此函数应检查所有数据,找到满足条件的项,并返回它们在good_items中的位置。

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

  1. 包含所有好索引的CCD_ 2
  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>

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

如果您知道限制,则可以使std::vector<size_t>对索引使用较小的类型。

如果您预计这个向量中会有很多元素,那么您可能会考虑使用boost::dynamic_bitset来节省内存并提高CPU缓存利用率。每个元素的比特,比特位置是原始向量的索引。

如果您打算删除统计谓词的元素,那么擦除-删除习语是最简单的解决方案。

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

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

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

根据我的理解,您正在解决的问题是两个集合的交集,我会从标准库中寻求解决方案:std::set_intersection

最新更新