我有一个功能:
void get_good_items(const std::vector<T>& data,std::vector<XXX>& good_items);
此功能应检查所有数据并查找满足条件的项目,并在good_items中返回 。
什么是最好的而不是std::vector<XXX>
?
std::vector<size_t>
包含所有好的索引。std::vector<T*>
包含指向项目的指针。std::vector<std::vector<T>::iterator>
包含项目的迭代器。修改
我将如何处理good_items
?
很多事情......其中之一是从矢量中删除它们并将它们保存在其他地方。也许别的什么后来
编辑2:
对我来说最重要的一点是,根据data
的结构,如何快速访问good_items
中的项目?
编辑3:
我刚才认为我的想法是错的。保持原始指针(或智能)作为向量的项目不是更好,所以我可以保持向量的实际值(这是指针),我不怕重复,因为它们只是指针?
答案 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