我有一个函数:
void get_good_items(const std::vector<T>& data,std::vector<XXX>& good_items);
此函数应检查所有数据,找到满足条件的项,并返回它们在good_items中的位置。
什么是最好的而不是std::vector<XXX>
?
- 包含所有好索引的CCD_ 2
- 包含指向项的指针的
std::vector<T*>
- 包含项的迭代器的
std::vector<std::vector<T>::iterator>
- 其他
编辑:
我将如何处理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