3

我有一个关于引用集合子集的快速问题。考虑我有一个对象向量。现在我想创建另一个向量,它是该向量的子集,并且我不想创建对象子集的副本。

我正在考虑的一种方法是创建一个vector<auto_ptr<MyClass> >. 这是一个好方法吗?如果您认为任何其他容器或习语或模式在这种情况下会有所帮助,请提出建议。谢谢

4

4 回答 4

7

不 !请参阅:为什么将 std::auto_ptr<> 与 STL 容器一起使用是错误的?

现在,作为替代方案,您可以存储原始指针或boost::shared_ptr根据您的需要。

于 2010-12-21T16:47:39.843 回答
2

另一种可能更多的 STL 方法是只使用一个向量,但使用成对的迭代器跟踪子范围(请注意,正是出于这个原因,所有算法都使用迭代器)

于 2010-12-21T17:16:15.050 回答
0

您可以使用索引向量:(vector<int>或者vector<size_t>如果您想学究气)。如果包含向量不是 constant,这比存储指针(一般含义的指针:原始 C/C++ 指针、shared_ptriterator等)要好。

考虑以下场景:“大”向量包含一个苹果、一个橙子和一个柠檬,而“小”向量包含一个指向苹果的指针。如果将一堆其他水果添加到大向量中,STL 将为该向量重新分配存储空间,因此指向苹果的指针将无效(指向已释放的内存)。

如果上述情况可能,请使用索引向量。如果不可能,请使用其他技术(例如,原始指针向量或对象副本向量)。

于 2010-12-21T17:41:47.173 回答
0

如果小节是连续的,您可以使用迭代器和指示您引用的项目数的计数来引用小节。

明智的做法是创建某种模板类,您可以使用容器引用和两个索引构建该类,并让该类执行所有边界和错误检查,尽管我不确定您如何能够判断底层容器是否在以后的某个时间仍然存在......

于 2016-03-02T11:03:00.150 回答